2017-10-05 4 views
2

私は1つの場合のデストラクタを特化することができますが、私はちょうど、他のケースのために、通常のデストラクタを使用するようにコンパイラに伝えるトラブルを抱えている:デストラクタを1つのケースだけに特化できますか?

#include <iostream> 

template <int = 0> 
struct Foo 
{ 
    ~Foo(); 
}; 

int main() 
{ 
    { 
     Foo<> a; // Normal destructor called 
    } 

    { 
     Foo<7> a; // Special destructor called 
    } 

} 

template<> 
Foo<7>::~Foo() { std::cout << "Special Foo"; } 

template<> 
Foo<>::~Foo() {} // Normal destructor does nothing. 

これは正常に動作しますが、今私は別のテンプレート引数を追加した場合例えば、Foo < 3> a;リンカーはデストラクタ定義を見つけることができないと言います。ちょうど7号のための特別なデストラクタを必要とし、通常のデストラクタを使って他のケースを処理する方法を教えてください。

私が試した:

Foo::~Foo() {} // Argument list missing 

Foo<int>::~Foo() {} // Illegal type for non-type template parameter 

template<> 
Foo<int>::~Foo() {} // Same thing 

template<int> 
Foo<>::~Foo() {} // Function template has already been defined 

答えて

4

は、どのように私はちょうど私がちょうど数7のための特別なデストラクタをしたいと言うと、通常のデストラクタで、他のケースを扱うことができますか?

一般デストラクタのように定義されるべきである:テンプレートパラメータがデフォルト値0を有しているので、上記のコードはFoo<0>のちょうど特殊なので

template<> 
Foo<>::~Foo() {} // Normal destructor does nothing. 

について

template <int I> 
Foo<I>::~Foo() { std::cout << "general dtor"; } 

Foo<7>の場合とまったく同じです。それは、非常に非常に甘い感謝

template<> 
Foo<0>::~Foo() {} 

LIVE

+0

と同等です。それらは、通常の/意図しないクラス関数のように、クラス自体でインラインで定義できますか? – Zebrafish

+0

@Zebrafishもちろん、はいです。 – songyuanyao

+0

私はあなたの答えをすでに受け入れていますが、あなたができると言ったように、クラスそのものに定義するのが難しいです。あまりにも多くの問題がなければ、Foo構造体のインラインで1つの定義の素早いスニペットを与えることができますか?コードはすでにあなたが与えたライブリンクに設定されています。 – Zebrafish

関連する問題