为什么不允许使用不同数量的模板参数的 class/struct 声明?
Why is a class/struct declaration with different number of template parameters not allowed?
template <class T1, class T2>
class A {};
template <class T1>
class A {};
A<int, int> a;
A<int> b;
此代码生成
error C2976: 'A' : too few template arguments
在 'A' class 的第二次声明中。
这里没有 SFINAE。您正在将最初带有 2 个模板参数的 class A
重新声明为另一个只有 1 个模板参数的模板,因此出现错误。 g++ 给出了更明确的错误:
error: redeclared with 1 template parameter class A {};
note: previous declaration 'template class A' used 2 template parameters
您的第一个声明定义了一个带有 2 个模板参数的 class A
。之后的任何内容都必须是该版本或其他启用版本的专门化。
如果您想允许 1 个或 2 个模板参数,您可以使用可变参数模板,如下所示:
template <class... Args>
class A;
template <class T1, class T2>
class A<T1, T2> {};
template <class T1>
class A<T1> {};
SFINAE 关于替换失败;也就是说,问题一定是您将哪些类型作为模板参数放置的结果。并非每个错误都符合条件...作为一个极端的例子,请考虑
template<T>
struct foo {
!@#*&!%^@
};
这也是一个错误,但不是替换失败:-)
template <class T1, class T2>
class A {};
template <class T1>
class A {};
A<int, int> a;
A<int> b;
此代码生成
error C2976: 'A' : too few template arguments
在 'A' class 的第二次声明中。
这里没有 SFINAE。您正在将最初带有 2 个模板参数的 class A
重新声明为另一个只有 1 个模板参数的模板,因此出现错误。 g++ 给出了更明确的错误:
error: redeclared with 1 template parameter class A {};
note: previous declaration 'template class A' used 2 template parameters
您的第一个声明定义了一个带有 2 个模板参数的 class A
。之后的任何内容都必须是该版本或其他启用版本的专门化。
如果您想允许 1 个或 2 个模板参数,您可以使用可变参数模板,如下所示:
template <class... Args>
class A;
template <class T1, class T2>
class A<T1, T2> {};
template <class T1>
class A<T1> {};
SFINAE 关于替换失败;也就是说,问题一定是您将哪些类型作为模板参数放置的结果。并非每个错误都符合条件...作为一个极端的例子,请考虑
template<T>
struct foo {
!@#*&!%^@
};
这也是一个错误,但不是替换失败:-)