簡體   English   中英

C ++對函數的未定義引用?

[英]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*);

(此問題是“未定義的引用”模板類構造函數的重復),並且答案就足夠了。

總結起來,有兩種方法可以解決此問題:

  • 正如@LuboAntonov所說,您可以將template void EventDispatcher::AddEventListener(AirHockeyServer*); 在定義功能模板之后。
  • 如許多其他文章所述,將實現移到標題中。

有關其他詳細信息,請參見另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM