我在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.cpp
,编译为main.obj并提供错误的文件,包括Quadtree.h
,它使用行QuadNode(sf::FloatRect);
声明函数(技术上,构造函数),并在文件{{ 1}}我包含Quadtree.cpp
并按如下方式定义构造函数:
Quadtree.h
请原谅任何糟糕的编码习惯,正如我所说的那样,我对C ++很新,我还在努力解决问题。任何帮助都表示赞赏(特别是如果我在某个地方犯了一个愚蠢或初学者的错误,我觉得我做了),如果你需要更多信息,我很乐意提供它。
答案 0 :(得分:3)
在C ++中,必须在头文件中定义模板化类。这是因为与C#中的泛型不同,它们在运行时跟踪<T>
类型,编译器实际上会为您使用它的每个<T>
生成一个新类。编译器无法实际编译类的模板形式,然后链接到类型信息。我认为,C ++中的模板实际上是在编译阶段之前发生的源代码转换形式。
有关原因的详细信息,请参阅此问题: