C++ 模板未在 header /链接器错误中定义

标签 c++ templates linker

<分区>

Possible Duplicate:
Why can templates only be implemented in the header file?

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

//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 的 undefined symbol : “std::__1::weak_ptr A::GetComponentFromName(char const*)”,引用自: _main 在 main.o 中 ld: 找不到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我通过直接在头文件中定义模板方法来修复它。

我应该总是在 header 中定义模板方法吗?为什么 ? 我在 OSX 上使用 clang++ 和 XCode,如果这有任何帮助的话

谢谢

最佳答案

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

Read This

关于C++ 模板未在 header /链接器错误中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13099531/

相关文章:

visual-c++ - Visual C++/CLI - CLR 类 - LNK2020 错误 - 如何修复?

c++ - 编译 boost 文件系统的教程文件时遇到问题

C++ opencv给Mat(矩阵)元素赋值时,之前赋值的元素发生了变化

c++ - 从数组创建或 reshape OpenCV 3 channel 垫

c++ - 从 C++ 调用 Julia SVD

asp.net - 如何在不访问 .ASP 文件的情况下自定义 Volusion 模板

c++ - += C++ 中的运算符,用于将作者添加到列表

c++ - undefined reference (模板)

c++ - 如何从另一个命名空间中显式特化函数模板?

ios - xCode 4.3.2 链接错误,但 arch 确实存在。为什么?