我正在学习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)。-结束注释
因此,我认为任何没有从基础/主要模板专门化的部分专门化模板都被认为是错误的,即使有时我们可以从正常的表达式生成一些非专门化形式的表达式。
发布于 2018-06-07 04:14:13
当您将类模板定义为:
template <int a, int b, int... cs> struct max { ... };
以下是有效的专门化。
template <int a, int b> struct max<a, b> { ... };
然而,以下内容并非如此。
template <int a> struct max<a> { ... };
因为基类模板至少需要两个模板参数。
发布于 2018-06-07 04:09:23
出现该错误的原因是,模板的每次调用都必须首先与基本模板匹配,然后才开始进行专门化。
你的基本模板应该匹配任意数量的参数,并且没有实现(因为max<>::value
没有任何意义),并且只有一个变量参数,而你的所有其他类都是这个变量的专门化。
#include <iostream>
#include <type_traits>
template<int... cs>
struct max;
template <int a, int b, int... cs>
struct max<a, b, cs...>: 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;
}
发布于 2018-06-07 04:09:29
不是答案,但为什么不简单地..。
template <int a, int... bs>
struct max : std::integral_constant<int,
(a > max<bs...>::value ? a : max<bs...>::value)> {};
template <int a>
struct max<a> : std::integral_constant<int, a> {};
...?
https://stackoverflow.com/questions/50728631
复制相似问题