#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;
}
如何将我的两个参数模板转换为一个参数模板?
上面的代码会给'A a;'一个编译错误对于“错误的模板参数数量”。
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您可以对第二个实例化类型使用(合理的)默认值:
template <class T1, typename T2 = void>
class A {
public:
void taunt() { cout << "A"; }
};