2012-01-27 18 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

woah - コードサンプルを修正できますか?コンテナ<>内に '〜queue'を定義していますが、どうしてデストラクタを明示的に呼び出すのですか? – sehe

+0

良い答えを得たい場合は、コンパイルするコードを投稿することをお勧めします。さらに、 '' queuel。〜list(); ''のようにデストラクタを呼び出すことはできません。 – grundprinzip

+1

@grundprinzip:デストラクタを明示的に呼び出すことは可能です。 –

答えて

4

編集:。。@Alsは、ポイントを持っているデストラクタを誤っても、あなたのクラスにちなんで命名された更新答え

あなたはクラスの仮想メソッドを持っているので、問題があることと思い++だけではgでありますクラスを継承して拡張する場合、基本クラスのデストラクタがクリーンアップを知らないメモリやその他のリソースを割り当てることができ、デストラクタが仮想でない場合は、実際のデストラクタではなく、基本クラスのデストラクタが呼び出されることがあります。

経験則は、iクラス内に仮想メソッドがある場合は、仮想デストラクタを使用します。 .cppファイルにデストラクタを誤っという名前のデストラクタ〜キューを削除し、あなたのクラス宣言に

virtual ~container(); 

を置くとimpementingことはあなたの問題を解決する必要があります。

+0

'virtual〜Queue(){}'をクラスに入れるだけで十分です。基本クラスは一般的にデータメンバを持たず、実際には基本クラスのデストラクタは派生クラスのデストラクタからのみ呼び出される(インライン展開)。 –

+1

@LucTourailleその点では、デザインの観点から見ると、クラスは仮想関数を持つようには見えません:-)。 –

+0

@ JoachimIsaksson良い点を除けば、私は1点について混乱している。あなたは答えの終わりに "基本クラスの'デストラクタ 'と呼ばれるかもしれませんか? – Zak

関連する問題