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つのパラメータテンプレートに変換するにはどうすればよいですか?

上記のコードは、「Aa;」でコンパイラエラーを発生させます。'テンプレート引数の数が間違っています'。

4

2 に答える 2

6

テンプレートの特殊化を使用してテンプレート引数の数を減らすことはできません。そのためには、一部の引数にデフォルトを使用する必要があります。

したがって、引数を 1 つだけ使用できるようにし、その使用法を特殊化にヒットさせるには、最初の引数と同じである 2 番目の引数のデフォルトが必要です。

#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;
}
于 2012-04-20T20:45:38.807 に答える
1

2番目のインスタンス化タイプに(適切な)デフォルトを使用できます。

template <class T1, typename T2 = void>
class A {
public:
    void taunt() { cout << "A"; }
};
于 2012-04-20T20:41:48.510 に答える