[英]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.cpp
是編譯成main.obj並給出錯誤的文件,其中包括Quadtree.h
,它用QuadNode(sf::FloatRect);
行聲明了該函數(從技術上講,構造函數QuadNode(sf::FloatRect);
,在文件Quadtree.cpp
我包含Quadtree.h
並按如下所示定義構造函數:
template<class T>
ld22::QuadNode<T>::QuadNode(sf::FloatRect bounds)
{
Bounds = bounds;
}
請原諒任何不好的編碼習慣,但正如我所說的那樣,我對C ++還是很陌生,我仍在努力弄清楚。 感謝您的幫助(特別是如果我在某個地方犯了一個愚蠢或初學者的錯誤,我覺得我確實做到了),並且,如果您需要更多信息,我將很樂意提供。
在C ++中,必須在頭文件中定義模板化的類。 這是因為與C#中的泛型不同,泛型在運行時會跟蹤<T>
類型,實際上編譯器會為使用它的每個<T>
生成一個新類。 編譯器無法實際編譯類的模板形式,然后鏈接類型信息。 我認為,C ++模板實際上是在編譯階段之前發生的一種源代碼轉換形式。
有關以下原因的更多信息,請參見此問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.