3 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
一個(gè)可能的原因是因?yàn)槟跊]有定義虛擬函數(shù)的情況下聲明它。
如果在沒有在同一編譯單元中定義它的情況下聲明它,則表明它已在其他位置定義 - 這意味著鏈接器階段將嘗試在其他編譯單元(或庫)中找到它。
定義虛函數(shù)的一個(gè)示例是:
virtual void fn() { /* insert code here */ }
在這種情況下,您將一個(gè)定義附加到聲明,這意味著鏈接器以后不需要解析它。
這條線
virtual void fn();
聲明fn()
而不定義它,并將導(dǎo)致您詢問的錯(cuò)誤消息。
它與代碼非常相似:
extern int i;int *pi = &i;
表明整數(shù)i
是在另一個(gè)編譯單元中聲明的,必須在鏈接時(shí)解析(否則pi
不能設(shè)置為它的地址)。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
混合-fno-rtti
和-frtti
編碼時(shí)也會(huì)發(fā)生這種情況。然后,您需要確保type_info
在-frtti
代碼中訪問的任何類都使用其密鑰方法進(jìn)行編譯-frtti
。當(dāng)您創(chuàng)建類的對象,使用dynamic_cast
等時(shí),可能會(huì)發(fā)生此類訪問。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
當(dāng)聲明的(非純)虛函數(shù)缺少實(shí)體時(shí)會(huì)發(fā)生這種情況。在您的類定義中,類似于:
virtual void foo();
應(yīng)該定義(內(nèi)聯(lián)或鏈接的源文件):
virtual void foo() {}
或者聲明純虛擬:
virtual void foo() = 0;
- 3 回答
- 0 關(guān)注
- 491 瀏覽
添加回答
舉報(bào)