簡體   English   中英

鏈接器看不到基類(純虛擬)中定義的模板函數

[英]Linker does not see template function defined in a base (pure virtual) class

這是代碼:

class PureDummy
{
    public:
        virtual void foo() = 0;
        template<class T>
        void bar();
};

class Dummy : public PureDummy
{
    public:
        virtual void foo() 
        {

        }
        template<class T>
        void bar()
        {

        }
};

int main(int argc, char **argv)
{
    PureDummy *pdummy = new Dummy();
    pdummy->foo(); //OK
    //pdummy->bar<int>();  //undefined reference to `void PureDummy::bar<int>()'
}

因此,正如評論所指出的,調用bar編譯失敗。

  1. 為什么模板函數表現出與“常規” foo函數不同的行為?

  2. 是否可以“指出”派生類中有一個實現?

pdummy的靜態類型是PureDummy *因此編譯器將首先在PureDummy類中檢查此類功能。 一個存在並且可以訪問,因此它將嘗試呼叫。 該函數是非虛擬的(模板不能是虛擬的),因此它將嘗試調用PureDummy::bar 該函數沒有定義,因此鏈接失敗並出現未定義的符號錯誤。

您正在調用PureDUmmy::bar ,但尚未提供其定義。

實際的結果是鏈接錯誤。

為了能夠在派生類中為運行時多態重寫一個函數(顯然,您正在嘗試通過指向基類的指針進行調用),它必須是virtual C ++不支持virtual函數的模板化。 在某些情況下適用的一種可行解決方案是將運行時多態替換為編譯時多態,並使用CRTP。

暫無
暫無

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

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