2010-02-03 2 views
0

STL과 함께 사용할 C++ 사용자 정의 할당기를 작성하고 있습니다. 클래스 정의에 다음 코드를 추가하면 컴파일됩니다.C++ STL 메모리 할당 자 컴파일 오류

#include "MyAlloc.hpp" 

#if 1 
template <typename T> 
typename MyAlloc<T>::pointer 
MyAlloc<T>::allocate(size_type n, MyAlloc<void>::const_pointer p) { 
    void *ptr = getMemory(n*sizeof(T)); 

    typename MyAlloc<T>::pointer tptr = static_cast<MyAlloc<T>::pointer>(ptr); 
    return tptr; 
} 
#endif 

그러나이 코드를 별도의 .cpp 파일에 넣으면 다음 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 오류는 static_cast 행에 있습니다.

g++ -c MyAlloc.cpp 
MyAlloc.cpp: In member function ‘typename MyAlloc<T>::pointer MyAlloc<T>::allocate(size_t, const void*)’: 
MyAlloc.cpp:9: error: expected type-specifier 
MyAlloc.cpp:9: error: expected `>' 
MyAlloc.cpp:9: error: expected `(' 
MyAlloc.cpp:9: error: expected `)' before ‘;’ token 
make: *** [MyAlloc.o] Error 1 

PT

답변

3

템플릿은 항상 번역 단위에서 정의해야합니다. 템플릿 함수를 사용하려면 템플릿의 정의가 별도의 .cpp 파일이 아니라 헤더 파일에 있어야합니다.

+0

-1. 컴파일러 오류와 관련된 질문과 다른 질문에 답합니다. 헤더에 템플릿을 정의하지 않으면 링크 오류가 발생하지만 링크가 시도되지 않습니다. –

+0

아니요, 컴파일러 오류입니다. 해당 번역 단위 내에 템플릿이 정의되어 있지 않으면 컴파일러에서 해당 템플릿을 컴파일 할 수 없습니다. 헤더 파일은 여러 구현 파일에서 함수/클래스/변수 이름을 유지하기위한 용도로 사용됩니다. –

+0

본질적으로 말하면, 정의되지 않은 함수 호출 (존재하지 않는 함수 호출)은 링커 오류입니다. 그렇지 않습니다. –

3

MyAlloc<T>::pointer 앞에 typename을 입력해야합니다. MyAlloc<T> 유형은 T에 따라 다르므로 컴파일러는 pointer이 typedef인지 또는 멤버 변수인지 함수인지 여부를 알지 못합니다. typename을 쓰지 않으면 컴파일러는 후자를 가정합니다.

+1

그리고 별도의 구현 파일에 넣을 수 없습니다. – UncleBens

+0

+1하지만 사용자의 실제 문제는 아니라고 생각합니다. –