我正在编写一个用于STL的C ++自定义分配器。当我将以下代码放在类定义中时,它编译:
#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
答案 0 :(得分:3)
必须始终在翻译单元中定义模板。为了使用模板函数,模板的定义需要放在头文件中,而不是单独的.cpp文件。
答案 1 :(得分:3)
您需要将typename
放在MyAlloc<T>::pointer
前面。由于MyAlloc<T>
的类型取决于T
,因此编译器不知道pointer
是typedef还是成员变量或函数。如果你不写typename
,那么编译器会假设后者。