1

我对 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);在文件中Quadtree.cpp我包含Quadtree.h并定义构造函数,如下所示:

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

请原谅任何不好的编码实践等等,正如我所说,我对 C++ 还很陌生,我仍在努力解决问题。感谢您提供任何帮助(特别是如果我在某处犯了愚蠢或初学者的错误,我觉得我确实做到了),如果您需要更多信息,我很乐意提供。

4

1 回答 1

3

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

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

于 2012-01-21T04:59:51.720 回答