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;
    }
};
4

1 に答える 1

4

編集:@Alsにはポイントがあり、デストラクタもクラスに対して誤った名前が付けられています。回答を更新しました。

問題は、g ++が、クラスに仮想メソッドがあるので、仮想デストラクタが必要だと考えていることです。これは、クラスを継承して拡張する場合、基本クラスのデストラクタがクリーンアップについて認識していないメモリまたはその他のリソースを割り当てることができ、デストラクタが仮想でない場合は、基本クラスのデストラクタが呼び出される可能性があることと関係があります。場合によっては、実際のデストラクタの代わりに。

経験則では、クラスに仮想メソッドがある場合は、仮想デストラクタを使用します。誤った名前のデストラクタ〜queueを削除し、

virtual ~container();

クラス宣言で、.cppファイルでデストラクタを実装すると、問題が解決するはずです。

于 2012-01-27T08:34:23.217 に答える