C++;STL内存分配器编译错误 我正在编写一个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 #包括“MyAlloc.hpp” #如果1 模板 typename MyAlloc::pointer MyAlloc::allocate(大小\类型n,MyAlloc::常量\指针p){ void*ptr=getMemory(n*sizeof(T)); typename MyAlloc::pointer tptr=static_cast(ptr); 返回tptr; } #恩迪夫

C++;STL内存分配器编译错误 我正在编写一个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 #包括“MyAlloc.hpp” #如果1 模板 typename MyAlloc::pointer MyAlloc::allocate(大小\类型n,MyAlloc::常量\指针p){ void*ptr=getMemory(n*sizeof(T)); typename MyAlloc::pointer tptr=static_cast(ptr); 返回tptr; } #恩迪夫,c++,memory,stl,allocator,C++,Memory,Stl,Allocator,但是当我把它放在一个单独的.cpp文件中时,我得到了以下错误。我做错了什么?错误在静态_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: e

但是当我把它放在一个单独的.cpp文件中时,我得到了以下错误。我做错了什么?错误在静态_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
g++-c MyAlloc.cpp
MyAlloc.cpp:在成员函数“typename MyAlloc::pointer MyAlloc::allocate(size\u t,const void*)”中:
MyAlloc.cpp:9:错误:应为类型说明符
MyAlloc.cpp:9:错误:应为“>”
MyAlloc.cpp:9:错误:应为“(”
MyAlloc.cpp:9:错误:在“;”之前应为“)”代币
make:**[MyAlloc.o]错误1

PT

模板必须始终在翻译单元中定义。为了使用模板功能,模板的定义需要放在头文件中,而不是单独的.cpp文件中。

模板必须始终在翻译单元中定义。为了使用模板函数,模板的定义需要放在头文件中,而不是单独的.cpp文件中。

您需要将
typename
放在
MyAlloc::pointer
前面。由于
MyAlloc
的类型取决于
T
,编译器不知道
指针是typedef还是成员变量或函数。如果不编写
typename
,编译器将采用后者。

您需要将
typename
放在
MyAlloc::pointer
前面。由于
MyAlloc
的类型取决于
T
,编译器不知道
指针是typedef还是成员变量或函数。如果不编写
typename
,则编译器将采用后者。

-1。回答与所问问题不同的问题,这与编译器错误有关。未能在标题中定义模板会导致链接错误,但甚至没有尝试链接。不,这是编译器错误。除非在翻译单元中定义了模板,否则编译器无法编译模板。这就是头文件的作用——在多个实现文件中持久化函数/类/变量名是链接器错误—不是。请注意,仍然可以将模板声明与实际实现分离,方法是将实现放在一个新文件中—我通常给它们一个.inl后缀—然后将.inl文件包含在.h/.hpp文件底部。-1。回答与所问问题不同的问题,这与编译器错误有关。未能在标题中定义模板会导致链接错误,但甚至没有尝试链接。不,这是编译器错误。除非在翻译单元中定义了模板,否则编译器无法编译模板。这就是头文件的作用——在多个实现文件中持久化函数/类/变量名是链接器错误--不是。请注意,仍然可以将模板声明与实际实现分离,方法是将实现放在一个新文件中(我通常给它们一个.inl后缀),然后将.inl文件放在.h/.hpp文件的底部。并且不能将其放在单独的实现文件中。+1,但我不认为这是用户的实际问题。你不能把它放在一个单独的实现文件中。+1,但我不认为这是用户的实际问题。