cpp文件中定义的外部模板方法的MSVC链接器错误LNK2001未解析 我在C++方面有些新(我通常在C语言中工作,但现在我正在做一个跨平台的项目),所以我不太习惯它的所有概念,也不知道如何编译/链接工作。所以,很自然,我不太清楚为什么会出现这个错误。我已经对错误进行了一些研究,当人们不链接库或在头文件中声明函数,但从不在头文件之外定义它时,这似乎是一个常见的问题。奇怪的是,我的错误不是这两个原因造成的。准确的错误文本如下所示:

cpp文件中定义的外部模板方法的MSVC链接器错误LNK2001未解析 我在C++方面有些新(我通常在C语言中工作,但现在我正在做一个跨平台的项目),所以我不太习惯它的所有概念,也不知道如何编译/链接工作。所以,很自然,我不太清楚为什么会出现这个错误。我已经对错误进行了一些研究,当人们不链接库或在头文件中声明函数,但从不在头文件之外定义它时,这似乎是一个常见的问题。奇怪的是,我的错误不是这两个原因造成的。准确的错误文本如下所示:,c++,visual-studio-2010,linker-errors,unresolved-external,lnk2001,C++,Visual Studio 2010,Linker Errors,Unresolved External,Lnk2001,“错误1错误LNK2001:未解析的外部符号“public:u thiscall ld22::QuadNode::QuadNode(类sf::Rect)”(?0$QuadNode@VDrawableObject@ld22@@@ld22@@QAE@V?$Rect@M@sf@@@Z)C:\Users\Nick\Documents\visualstudio 2010\Projects\GDCSFMLTest\GDCSFMLTest\main.obj“ 对我来说,这似乎是在告诉我,我从未实现过该文件。但

错误1错误LNK2001:未解析的外部符号“public:u thiscall ld22::QuadNode::QuadNode(类sf::Rect)”(?0$QuadNode@VDrawableObject@ld22@@@ld22@@QAE@V?$Rect@M@sf@@@Z)C:\Users\Nick\Documents\visualstudio 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;
}
模板
ld22::QuadNode::QuadNode(sf::FloatRect边界)
{
界限=界限;
}

请原谅任何坏的编码实践和其他什么,正如我所说的,我对C++是相当新的,我仍然在努力解决问题。任何帮助是值得赞赏的(特别是如果我犯了愚蠢或初学者错误某处,我有点感觉我做了),如果你需要更多的信息,我很乐意提供它。

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


MSVC允许在头文件之外实现模板函数,但这不能跨越dll边界。谢谢!我知道这是一种愚蠢的错误,要么是初学者,要么是阅读不够。我发现我太习惯了“在报头中声明,在另一个文件中定义”C++的概念,并假设它对于所有的情况都是一样的。只要StackOverflow让我接受这个答案,我会的。