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
と同等です。それらは、通常の/意図しないクラス関数のように、クラス自体でインラインで定義できますか? – Zebrafish
@Zebrafishもちろん、はいです。 – songyuanyao
私はあなたの答えをすでに受け入れていますが、あなたができると言ったように、クラスそのものに定義するのが難しいです。あまりにも多くの問題がなければ、Foo構造体のインラインで1つの定義の素早いスニペットを与えることができますか?コードはすでにあなたが与えたライブリンクに設定されています。 – Zebrafish