c ++部分专业化:如何将此模板<class T1,class T2>专门化为此模板<class T1>?

use*_*343 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

上面的代码会给'A a;'一个编译错误 '错误的模板参数数'.

Kle*_*ist 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要一个默认参数来实现他想要的答案,那将会很高兴.问题是由于对部分模板专业化的误解造成的.它不允许您减少原始声明中的模板参数数量.它所说的是"如果两个模板参数相同,请使用此参数".对于正确的答案仍然是+1.:) (2认同)