[英]C++ undefined reference to function?
我在一個名為EventDispatcher
的類中定義了一個公共模板函數:
public:
template <class className> void AddEventListener ( className* );
該函數實現如下:
template <class className>
void EventDispatcher::AddEventListener ( className* ptr )
{
};
然后在某個類中,我創建一個Timer
的實例,該實例是子EventDispatcher
並調用AddEventListener
:
timer->AddEventListener ( this );
我得到一個錯誤之后
/tmp/ccjRF7sK.o: In function `AirHockeyServer::AirHockeyServer()':
AirHockeyServer.cpp:(.text+0xa5): undefined reference to `void EventDispatcher::AddEventListener<AirHockeyServer>(AirHockeyServer*)'
/tmp/ccjRF7sK.o: In function `AirHockeyServer::AirHockeyServer()':
AirHockeyServer.cpp:(.text+0x187): undefined reference to `void EventDispatcher::AddEventListener<AirHockeyServer>(AirHockeyServer*)'
collect2: ld returned 1 exit status
您說已經定義了函數,但是只向我們顯示了一個聲明。 您還需要一個定義:
template <class className> void AirHockeyServer::AddEventListener ( className* )
{
// code goes here
}
注意該問題現已更新,以表明某處有一個定義。
由於它是模板,因此需要進入標頭,該標頭包含在使用該功能的每個源文件中。 模板在使用時實例化,並且需要完整定義以實例化它們。
同樣,您可以在類定義中定義它:
public:
template <class className> void AddEventListener ( className* )
{
// code goes here
}
這是一個鏈接器錯誤,告訴您該鏈接器看不到AddEventListener
成員函數的實現。 對於模板,通常將函數的實現放在頭文件中,因此可以為任何模板參數自變量實例化它們。
鏈接器找不到template<class className> AddEventListener<className*>
。 對於模板,實現必須與聲明位於同一文件中。
當您有模板時,就無法真正將類拆分到單獨的頭文件和源文件中。 您還需要將定義放在頭文件中。
模板函數需要針對特定類型進行實例化。 將實現文件放在.cpp文件中不會執行此操作。
最簡單的方法是將其放置在類定義本身中,或緊隨其后放在頭文件中。
另一種方法是將其保存在.cpp文件中,然后對所需類型進行顯式實例化:
template void EventDispatcher::AddEventListener(AirHockeyServer*);
(此問題是“未定義的引用”模板類構造函數的重復),並且答案就足夠了。
總結起來,有兩種方法可以解決此問題:
template void EventDispatcher::AddEventListener(AirHockeyServer*);
在定義功能模板之后。 有關其他詳細信息,請參見另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.