可能重复:
为什么模板只能在头文件中实现?
我刚刚遇到了一些我无法理解的事情。在以下情况下,我在链接阶段遇到了问题。
//header file
class A
{
template<class T>
std::weak_ptr<T> GetSomethingFromSomeWhere(const char* Id);
};
//cpp file
template<class T>
std::weak_ptr<T> A:GetSomethingFromSomeWhere(const char* id)
{
//A method with the right stuff inside and the right return statement
...
}
//Another class
class B
{
};
//main.cpp
int main ()
{
A a;
auto pB = a.GetSomethingFromSomeWhere<B>( "id" );
}
这没有编译,在链接期间我有这样的东西:
架构 x86_64 的未定义符号:“std::__1::weak_ptr A::GetComponentFromName(char const*)”,引用自:main.o ld 中的 _main:未找到架构 x86_64 clang 的符号:错误:链接器命令退出代码 1 失败(使用 -v 查看调用)
我通过直接在头文件中定义模板方法来修复它。
我应该总是在标题中定义模板方法吗?为什么 ?我在 OSX 上,并在 XCode 中使用 clang++,如果有帮助的话
谢谢