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

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

template <class T1>
class A {};

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

这段代码生成了错误

错误 C2976:'A':模板参数过少

在'A'类的第二个声明中产生了该错误。

3个回答

9

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

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

template <class... Args>
class A;

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

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

实时演示


5

这里没有使用SFINAE。你正在重新声明类A,原本有2个模板参数,现在变成了只有1个模板参数,因此出现了错误。g++给出了更明确的错误信息:

错误:使用1个模板参数重新声明了class A {};

注意:之前的声明“template class A”使用了2个模板参数


0

SFINAE 是关于替换失败的;也就是说,问题必须是由你作为模板参数放置的类型引起的后果。并不是每个错误都能够胜任... 以极端的例子来考虑

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接