提问人:Pokelover980 提问时间:1/21/2012 最后编辑:Raymond ChenPokelover980 更新时间:2/18/2014 访问量:3670
MSVC 链接器错误LNK2001 cpp 文件中定义的模板方法的外部未解决
MSVC Linker Error LNK2001 unresolved external for template method defined in cpp file
问:
我对 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.cpp
Quadtree.h
QuadNode(sf::FloatRect);
Quadtree.cpp
Quadtree.h
template<class T>
ld22::QuadNode<T>::QuadNode(sf::FloatRect bounds)
{
Bounds = bounds;
}
请原谅任何糟糕的编码实践等等,正如我所说,我对 C++ 相当陌生,我仍在努力解决问题。任何帮助都是值得赞赏的(特别是如果我在某个地方犯了一个愚蠢或初学者的错误,我有点觉得我做到了),如果你需要更多信息,我很乐意提供它。
答:
在 C++ 中,必须在头文件中定义模板化类。这是因为与 C# 中的泛型不同,泛型在运行时跟踪类型,编译器实际上会为每个使用它的类生成一个新类。编译器无法实际编译类的模板化形式,然后链接类型信息。在我看来,C++ 中的模板实际上是一种在编译阶段之前发生的源代码转换形式。<T>
<T>
有关原因的更多信息,请参阅此问题:
评论
上一个:如何跟踪此链接器错误?
评论