2012-01-27 185 views
0

得到一個錯誤,它是一個非虛擬析構函數的虛函數。我該如何解決這個錯誤?它在g ++ 4.6.x中工作,但我需要它在g ++的舊版本上工作。 :(虛擬析構函數?

#include <list> 

template <typename T> 
class container{ 
public: 
    ~queue(){ 
     queuel.clear(); 
     queuel.~list(); 
    } 
    virtual T func_x(){ 
     T temp; 
     //do stuff with list<t> test 
     return temp; 
    } 
private: 
    std::list<T> test; 
}; 

template <typename T> 
class container2 : public container<T>{ 
public: 
    virtual T func_x(){ 
     T temp; 
     //do different stuff with list<T> test 
     return temp; 
    } 
}; 
+1

哇 - 你能修復代碼示例嗎?你正在'container <>'中定義'〜queue',爲什麼你明確地調用析構函數? – sehe 2012-01-27 08:37:17

+0

如果你想得到一個很好的答案,我建議發佈代碼編譯。此外,你不能像調用''queuel。'list();'' – grundprinzip 2012-01-27 08:37:24

+1

@grundprinzip那樣調用析構函數:是的,你可以顯式調用一個析構函數,即使在這裏可能沒有理由這麼做。 – 2012-01-27 08:41:07

回答

4

編輯:@Als有一個點,析構函數也是錯誤命名爲類更新的答案

的問題僅僅是G ++認爲,因爲你必須在類的虛方法。 ,你應該有一個虛擬的析構函數,如果你繼承一個類並對其進行擴展,你可以分配內存或其他資源,而這些資源對於基類析構函數並不知道如何清理,如果析構函數不是虛擬的,在某些情況下,可能會調用基類的析構函數,而不是真正的析構函數。

經驗法則是,我如果你的課堂上有虛擬方法,請使用虛擬析構函數。在.cpp文件中刪除錯誤命名的析構函數〜隊列,並把

virtual ~container(); 

在類的聲明和impementing析構函數應該解決您的問題。

+0

只要在課堂中加入'virtual〜Queue(){}'就足夠了。基類通常沒有任何數據成員,實際上,基類析構函數只能從派生類的析構函數中調用(所以內聯工作)。 – 2012-01-27 08:39:28

+1

@LucTouraille對於這個問題,從設計的角度來看,這個類並不像它應該有任何虛函數:-)。 – 2012-01-27 08:40:52

+0

@JoachimIsaksson好的解釋,除了我對一點感到困惑。你的意思是「你的答案最後可能會調用」基類的'析構函數「嗎? – Zak 2013-02-12 18:10:01