1

このコードはテンプレートの特殊

template<class T> 
class Base 
{ 
    virtual void method() = 0; 
}; 

template<> 
void Base<int>::method() { std::cout << "overrided" << std::endl; } 

Base<int> base; 

をコンパイルして動作するように期待しかし、それは'Base<int>': cannot instantiate abstract classエラーが発生します。部分的な専門化は、Base<int>を非抽象化し、それをインスタンス化することを可能にする。

このような短い解決策があり、Baseクラス抽象クラスを保持していますか?そうでなければ私はBaseクラス非抽象を作るか、ここからニコルボーラのソリューションを使用することができます(代わりに一つだけのメンバ関数の)クラス全体の専門性についてTemplate specialization and inheritance

+0

通常の抽象クラスであっても、純粋仮想関数の定義を持つことができます。しかし、それはあまり抽象的ではありません。あなたはまだそれのインスタンスを作成することはできません。 – Arunmu

+2

@Arunmu答えはコメントではなく答えとして表現されますか? –

+0

@AlanStokes私はあなたに同意しますが、私はそのコメントでOPに答えたとは思いません。 – Arunmu

答えて

4

テンプレート以外のクラスではうまくいかない場合は、テンプレートクラスではどうしてうまくいかなければなりませんか?

#include<iostream> 

class Base 
{ 
    virtual void method() = 0; 
}; 

void Base::method() { std::cout << "overrided" << std::endl; } 

Base base; 

エラー:

10 : error: cannot declare variable 'base' to be of abstract type 'Base' 
Base base; 
^ 
3 : note: because the following virtual functions are pure within 'Base': 
class Base 
^ 
8 : note: virtual void Base::method() 
void Base::method() { std::cout << "overrided" << std::endl; } 
^ 
Compilation failed 
+0

答えをありがとう。私は純粋な仮想関数の定義が抽象クラスを非抽象的にすると仮定しました。 –

2

何:

template<class T> 
struct TempClass 
{ 
    virtual void f() = 0; 
}; 

template <> 
struct TempClass<int> 
{   
    virtual void f() 
    { 
     //... 
    } 
}; 

TempClass<int>がノーであることより長い抽象クラスが、その他のBaseクラスは依然として抽象クラス(TempClass<float>,TempClass<double>TempClass<SomeClassType>...)です。

それはジェネリッククラスTempClassが含まれているフィールドが含まれません。あなたは、両方の専門を持っているし、それらのテンプレートクラスは、その基本クラスから継承させるフィールドを持つ基本クラスを作成します

、コピー&ペーストするためにそれらをより巧妙な解決策である一般的なベース または、からになります。

template <typename T> 
struct Base 
{ 
    // some members that all Base classes have 
}; 


template <typename T> 
struct TempClass: Base<T> 
{ 
    virtual void f() = 0; 
}; 


template <> 
struct TempClass<int>: Base<int> 
{ 
    virtual void f() 
    { 
     //... 
    } 
}; 

このように醜いコピー・ペーストは必要ありませんでした。

+0

TempClass には、汎用クラスTempClassのフィールドが含まれていないとします。どうして? –

+0

@Aleksey各*クラステンプレートの特殊化*は別個の(新しい)クラステンプレートと見なされるためです。 – PcAF

+0

助けてくれてありがとう、私はテンプレートの専門化が継承のように働いたと思った。 –

0

クラスの純粋仮想関数の実装を提供することが可能です。クラスをインスタンス化することはできません。

class Base 
{ 
    virtual void method() = 0; 
}; 

void Base::method() { /* Do something */ } 

// This is still a problem since Base 
// is still an abstract class, i.e. it is not still not 
// instantiable. 
Base base; 
関連する問題