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;
}

如何将我的两个参数模板转换为一个参数模板?

上面的代码会在 'A a;' 上给出一个编译器错误 对于“错误数量的模板参数”。

4

2 回答 2

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

您可以为第二种实例化类型使用(合理的)默认值:

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