2011-01-20 15 views
2

このコードで何が間違っていますか?C++の抽象基本クラステンプレート

template <class T> 
class A 
{ 
private: 
    T a; 

public: 
    A(): a(0) {} 
    virtual ~ A() = 0; 
}; 


template <class T> 
class A; 

template <class T> 
class B : public A<T> 
{ 
private : 
    T b; 

public: 
    B() : A<T>() {} 
    virtual ~B(){} 


}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
B <double> bb; 
return 0; 
} 

エラーLNK2019:未解決の外部シンボル "パブリック:仮想__thiscallのA ::〜A(無効)"(?? 1 $ A @ N @@ UAE @ XZ?)「パブリック関数の中で参照:仮想__thiscall B ::〜B(空白)」

答えて

8

Aのデストラクタを純粋な仮想として宣言します。これは、クラスがインスタンス化されないことを保証したい場合は、すべてうまくいき、良いことです。しかし、BのデストラクタがBオブジェクトのA::~A()を自動的に呼び出すため、コードのどこかにA::~A()を定義する必要があります。純仮想と宣言したので、~Bのようにインラインで定義することはできません。その定義をクラス定義の外に含める必要があります。

+0

のデストラクタを呼び出すようにしようとします。 (移植可能ではありませんが、どちらも '_tmain(int、_TCHAR * [])'です) –

+0

私はあなたもGCCでできると信じています。しかし、私はそれを純粋な仮想として宣言することはできませんし、同時にインラインで実装することはできません(クラス定義の後にインラインで実装しない限り)。 –

0

基本クラスのデストラクタの実装を提供する必要があります。デストラクタが純粋仮想と宣言されても、派生クラスを破棄する実装が必要です。

+0

そう?テンプレート ::〜A(){} – Woody

+0

はい。 (15文字) –

1

あなたのスーパークラスのデストラクタは純粋な仮想ではなく、ただ仮想であるべきではありません。

virtual ~A() {} 

Bのデストラクタが自動的に私はそれがVC++でインラインで実装することができると信じA.

関連する問題