将含模板函数的类移入命名空间后出现链接错误的原因
问题:将类移入命名空间后模板函数链接失败(已解决)
编辑 - 已解决:将模板函数定义移至头文件后问题解决。
原文问题
我在谷歌和Stack Overflow搜过答案,但不确定关键词,没找到完全匹配的结果。以下是简化后的场景:
最初的类定义(可正常编译):
struct MyClass { template <typename T> T* myFunction(); };
对应的.cpp文件实现:
template <typename T> T* MyClass::myFunction() { // some code }
因需求需要将类放入命名空间,修改后的头文件定义:
namespace MyNamespace { struct MyClass { template <typename T> T* myFunction(); }; }
对应的.cpp文件实现:
namespace MyNamespace { template <typename T> T* MyClass::myFunction() { // some code } }
修改后,调用该函数的文件出现链接错误:
ld: Undefined symbols: MyNamespace::SomeClass* MyNamespace::MyClass::myFunction<MyNamespace::SomeClass>(), referenced from: MyNamespace::anotherFunction() in anotherFile.cpp.o
调用代码如下:
namespace MyNamespace { void anotherFunction() { SomeClass* object = anotherObject->myFunction<SomeClass>(); } }
我觉得自己对模板参数的使用有误解,为什么把类移入命名空间会导致链接失败?我已经确保所有文件都包裹在正确的命名空间中,必要头文件也在命名空间声明前导入了。
内容的提问来源于stack exchange,提问作者ERSUCC
相关产品推荐
相关产品推荐

