2016-09-16 1 views
1

std :: enable_if引数を持つテンプレートクラスに対して、行外デストラクタ本体を書き込むにはどうすればよいですか?デストラクタの行外定義が有効な場合、if class?

(これは、デコレータを作成し、他のオブジェクトタイプに識別子を追加するために必要です)。

コード:

template<typename T, 
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr> 
class IdentifiedInstance: public T 
{ 
public: 
    virtual ~IdentifiedInstance() = 0; // abstract base, still needs a function body 
}; 

ボディの定義:

template<typename T, 
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr> 
IdentifiedInstance::~IdentifiedInstance() 
{ 
} 

IdentifiedInstance::IdentifiedInstance<T, ???>::する必要がありますので、これはコンパイルされません。

ここで2番目のパラメータ値は何ですか。 これを正しく書き込むにはどうすればよいですか?

注意事項(1)

のVisual Studio 2015は、このフォームを受け入れ

残念ながら、私はニーズを記述したコードは、Linuxの下で構築される(とgccは当然、このフォームにチョーク
template<typename T, 
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr> 
class IdentifiedInstance: public T 
{ 
public: 
    ~IdentifiedInstance() = 0 
    { 
    } 
}; 

)。

注(2):私はこのオンライン検索を試みましたが、私が見つけたほとんどの回答は、デストラクタのみを部分的に専門化する方法を指していました。

答えて

2

これはどうですか?

template<typename T, 
typename std::enable_if<std::is_base_of<X,T>::value>::type* S> 
IdentifiedInstance<T,S>::~IdentifiedInstance() 
{ 
} 

2番目のパラメータにちょうど名前を付けます。

デフォルト値を2回(宣言と定義)しない場合があるため、デフォルト値も削除しました。

関連する問題