0

可能重复:
为什么模板只能在头文件中实现?

我刚刚遇到了一些我无法理解的事情。在以下情况下,我在链接阶段遇到了问题。

//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++,如果有帮助的话

谢谢

4

1 回答 1

1

模板定义需要对使用它的代码可见。否则将产生链接器错误。对于这种情况,有不同的解决方法:

读这个

于 2012-10-27T11:02:23.220 回答