不允许非类型参数的部分模板专用化
Partial template specialization of non type argument not allowed
以下代码不起作用,它给出一个错误,说"struct foo 的模板参数太少",我不明白为什么。对我来说,代码似乎是有效的。我在"参数列表"部分的第 4 段中找到了 CPP 参考的一个片段,这可能解释了为什么它不起作用,但我不明白。
template<int a, int b, int c> struct foo { };
template<int a> struct foo<a, 0, 0> { };
int main()
{
foo<1> f;
}
这是
允许的。但是您的模板需要 3 个参数。专用它不会神奇地将其变成 1 参数模板。
但是,您可以使其他参数具有默认参数:
template<int a, int b = 0, int c = 0> struct foo { char _[1] ; };
template<int a> struct foo<a, 0, 0> { char _[10] ;};
int main() {
static_assert(sizeof(foo<1>) > sizeof(foo<1, 1, 1>), "");
return 0;
}
这不是模板专业化的工作方式。您必须*来指定所有参数。
*(除非您有默认参数(请参阅@StoryTeller的答案(,或者当C++17参数推导启动时,但两者都不适用于此处。
这是一个小演示:
#include <iostream>
template<int a, int b, int c> struct foo { void bar() {std::cout << "1n";} };
template<int a> struct foo<a, 0, 0> { void bar() {std::cout << "2n";} };
int main()
{
foo<1, 2, 3> a;
foo<4, 0, 0> b;
a.bar(); // prints 1
b.bar(); // prints 2
}
请注意,主模板采用 3 个模板参数。然后,您必须指定所有这些。例如
foo<1, 0, 0> f; // the partial specification is used
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 按非类型参数类型划分的模板专用化
- C++模板专用化因非类型参数包而失败
- 使用类型参数专用化部分模板参数(VC++ v140 工具集)
- 模板专用于参数而不是类型
- C++任何非类型参数的模板专用化
- 不允许非类型参数的部分模板专用化
- 部分专用化非类型参数
- X 的任何子类的专用类模板,无需向模板添加其他类型参数
- 枚举类型参数的专用成员模板
- C++可以拥有一个包含不同类型参数的专用模板对象的容器
- 使用类型和模板模板参数对模板类中的类型参数进行部分专用化
- C++:将部分专用模板的类型参数作为另一个模板类的成员类型
- 为什么不允许非类型参数中的部分专用化使用嵌套模板参数