为什么不允许使用不同数量的模板参数的类/结构声明?

时间:2015-05-26 05:41:58

标签: c++ templates sfinae

template <class T1, class T2>
class A {};

template <class T1>
class A {};

A<int, int> a;
A<int> b;

此代码生成

  

错误C2976:&#39; A&#39; :模板参数太少

在A&#39;的第二次讨论中类。

3 个答案:

答案 0 :(得分:8)

您的第一个声明定义了一个带有2个模板参数的类A。之后的任何事情都必须是该特殊化或其他一些启用的版本。

如果要允许1或2个模板参数,可以使用可变参数模板,如下所示:

template <class... Args>
class A;

template <class T1, class T2>
class A<T1, T2> {};

template <class T1>
class A<T1> {};

Live demo

答案 1 :(得分:5)

这里没有SFINAE。您将最初具有2个模板参数的类A重新声明为仅具有1个模板参数的另一个,因此错误。 g ++给出了一个更明确的错误:

  

错误:使用1个模板参数类A {};

重新声明      

注意:之前的声明&#39;模板类A&#39;使用了2个模板参数

答案 2 :(得分:0)

SFINAE是一个替代失败;即问题必须是您作为模板参数放置的类型的结果。不是每个错误都符合......作为一个极端的例子考虑

template<T>
struct foo {
    !@#*&!%^@
};

这也是一个错误,但不是替换失败: - )