c ++部分专业化:如何将此模板<class t1,=“”class =“”t2 =“”>专门化为此模板<class t1 =“”>?</class> </class>

时间:2012-04-20 20:37:27

标签: c++ templates partial-specialization

#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;'一个编译错误对于“错误的模板参数数量”。

2 个答案:

答案 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"; }
};