MSVC 链接器错误LNK2001 cpp 文件中定义的模板方法的外部未解决

MSVC Linker Error LNK2001 unresolved external for template method defined in cpp file

提问人:Pokelover980 提问时间:1/21/2012 最后编辑:Raymond ChenPokelover980 更新时间:2/18/2014 访问量:3670

问:

我对 C++ 有点陌生(我通常用 C# 工作,但现在我正在做一个有点跨平台的项目),所以我并不真正习惯它的所有概念以及编译/链接的工作原理。所以,自然而然地,我不太确定为什么会出现这个错误。我已经对这个错误进行了一些研究,这似乎是人们不链接库或在头文件中声明函数但从不在其之外定义它时经常遇到的问题。奇怪的是,我的错误不是任何一个的结果。确切的错误文本是这样的:

"Error 1 error LNK2001: unresolved external symbol "public: __thiscall ld22::QuadNode<class ld22::DrawableObject>::QuadNode<class ld22::DrawableObject>(class sf::Rect<float>)" (??0?$QuadNode@VDrawableObject@ld22@@@ld22@@QAE@V?$Rect@M@sf@@@Z) C:\Users\Nick\Documents\Visual Studio 2010\Projects\GDCSFMLTest\GDCSFMLTest\main.obj"

对我来说,它似乎试图告诉我,我从未实现过该文件。但是,我有。,编译成 main.obj 并给出错误的文件包括 ,它用行声明函数(从技术上讲,构造函数),并在文件中包含并定义构造函数,如下所示:main.cppQuadtree.hQuadNode(sf::FloatRect);Quadtree.cppQuadtree.h

template<class T>
ld22::QuadNode<T>::QuadNode(sf::FloatRect bounds)
{
    Bounds = bounds;
}

请原谅任何糟糕的编码实践等等,正如我所说,我对 C++ 相当陌生,我仍在努力解决问题。任何帮助都是值得赞赏的(特别是如果我在某个地方犯了一个愚蠢或初学者的错误,我有点觉得我做到了),如果你需要更多信息,我很乐意提供它。

C++ Visual-Studio-2010 链接器错误 解决-外部 LNK2001

评论


答:

3赞 Jonathon Reinhart 1/21/2012 #1

在 C++ 中,必须在头文件中定义模板化类。这是因为与 C# 中的泛型不同,泛型在运行时跟踪类型,编译器实际上会为每个使用它的类生成一个新类。编译器无法实际编译类的模板化形式,然后链接类型信息。在我看来,C++ 中的模板实际上是一种在编译阶段之前发生的源代码转换形式。<T><T>

有关原因的更多信息,请参阅此问题:

评论

0赞 x4u 1/21/2012
MSVC 允许在头文件外部实现模板函数,但这不能跨 dll 边界工作。
0赞 Pokelover980 1/21/2012
谢谢!我知道这将是某种愚蠢的错误,因为是初学者或阅读不足。我看到我太习惯了 C++ 的整个“在标头中声明,在另一个文件中定义”的概念,并假设它在所有情况下都是一样的。只要 StackOverflow 让我接受这个作为我的答案,我就会接受。