2012-04-20 3 views
3
#include <iostream> 
using namespace std; 

template <class T1, class T2> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 

template <class T1> 
class A<T1, T1> { 
public: 
    void taunt() { cout << "B"; } 
}; 

class B {}; 

class C {}; 

int main (int argc, char * const argv[]) { 

    A<B> a; 

    return 0; 
} 

2つのパラメータテンプレートを1つのパラメータテンプレートに変換するにはどうすればよいですか?C++部分的特化:このテンプレート<class T1、class T2>をこのテンプレート<class T1>に特化させるにはどうしたらいいですか?

上記のコードは 'A a;'のコンパイラエラーを表示します。 '間違った数のテンプレート引数'のために。

答えて

6

テンプレートの特殊化を使用すると、いくつかのためにデフォルト値を使用する必要があることを行うには、テンプレート引数の数を減らすために使用することはできません議論。

だから、唯一の引数の使用を許可し、その使用量は、あなたの専門分野をヒットさせるためには、あなたが最初の引数と同じである第二引数のデフォルトが必要:

#include <iostream> 
using namespace std; 

template <class T1, class T2=T1> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 

template <class T1> 
class A<T1, T1> { 
public: 
    void taunt() { cout << "B"; } 
}; 

class B {}; 

class C {}; 

int main (int argc, char * const argv[]) { 

    A<B> a; 
    a.taunt(); // Prints "B" 

    return 0; 
} 
+2

それは次のようになり彼があなたの答えにしたいものを達成するためにデフォルトの引数が必要な理由を追加していいです。この問題は、部分的なテンプレートの特殊化が何をしているのかという誤解によって引き起こされます。元の宣言のテンプレートパラメータの数を減らすことはできません。それは、 "両方のテンプレートの引数が同じであれば、この引数を使用する"ということです。それでも正しい答えは+1です。 :) – vhallac

+0

@vhallac:良いコメント、完了:) – Kleist

1

あなたは、第二のインスタンス化のタイプについて(賢明な)デフォルトを使用することができます。

template <class T1, typename T2 = void> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 
関連する問題