我正在学习C++11可变模板,并创建了一个模板结构来计算给定列表的最大数量,并尝试:
#include <iostream>
#include <type_traits>
template <int a, int b, int... cs>
struct max: std::integral_constant<int, (a>b? max<a, cs...>::value: max<b, cs...>::value)> {};
template <int a, int b>
struct max<a, b>: std::integral_constant<int, (a>b? max<a>::value: max<b>::value)> {};
template <int a>
struct max<a>: std::integral_constant<int, a> {};
int main() {
std::cout << max<2,1,5,7>::value << std::endl;
return 0;
}
但g++抱怨道:
test.cc:7:58: error: wrong number of template arguments (1, should be at least 2)
struct max<a, b>: std::integral_constant<int, (a>b? max<a>::value : max<b>::value)> {};
test.cc:9:13: error: wrong number of template arguments (1, should be at least 2)
struct max<a>: std::integral_constant<int, a> {};
我可以通过在前面添加一个简单的声明来运行它:
template <int...>
struct max;
并将上面的第一个模板更改为:
template <int a, int b, int... cs>
struct max<a, b, cs...>: ...
我提到了cppreference:https://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering,但我找不到任何对我的情况有用的解释。
问题可能来自只有一个模板参数的最后一个模板(max<a>
),该模板参数不是主模板的专用版本。
所以我的问题是:
为什么无法匹配max<a>
?有没有什么规则或标准来处理这个问题?
=================================================================
好的,我找到了C++标准(文件编号:N4659)表示:
注意:通过查找主类模板和,然后考虑该模板的所有部分专门化,可以找到类模板的部分专门化。如果使用声明命名了一个类模板,则在使用声明之后引入的部分专门化实际上是可见的,因为主模板是可见的(17.5.5)。-结束注释
因此,我认为任何没有从基础/主要模板专门化的部分专门化模板都被认为是错误的,即使有时我们可以从正常的表达式生成一些非专门化形式的表达式。
https://stackoverflow.com/questions/50728631
复制相似问题