C++ C++;模板:无法匹配变量类模板中的最后一个模板
我正在学习C++11可变模板,并创建了一个模板结构来计算给定列表的最大数量,并尝试:C++ C++;模板:无法匹配变量类模板中的最后一个模板,c++,c++11,templates,variadic,partial-ordering,C++,C++11,Templates,Variadic,Partial Ordering,我正在学习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)>
#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;
}
#包括
#包括
模板
struct max:std::integral\u constantb?最大值
但我找不到任何有用的解释
问题可能来自最后一个模板(max
),它只有一个模板参数,而不是主模板的专用版本
所以我的问题是:
为什么max
无法匹配?是否有任何规则或标准来处理这个问题
=================================================================
< >我发现C++标准(No.465文档)表示:
[注意:类模板的部分专门化由
查找主类模板并然后考虑所有部分
该模板的专门化。如果使用声明命名类
模板,在
由于主模板
可见(17.5.5)。-结束注释]
因此,我认为任何不从基/主模板专门化的部分专门化模板都被认为是错误的,即使有时我们可以从普通模板生成一些非专门化的表达式形式。出现该错误的原因是,模板的每次调用都必须首先与基模板匹配,专业化只是在那之后才开始
您的基础模板应该匹配任意数量的参数,并且没有实现(因为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;
}
#包括
#包括
模板
结构最大值;
模板
struct max:std::integral\u constantb?max::value:max::value)>{};
模板
struct max:std::integral\u constantb?max::value:max::value)>{};
模板
struct max:std::integral_常量{};
int main(){
std::cout不是答案,但为什么不简单地
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> {};
模板
结构max:std::integral_常量max::value?a:max::value)>{};
模板
struct max:std::integral_常量{};
当您将类模板定义为:
template <int a, int b, int... cs> struct max { ... };
template struct max{…};
以下是有效的专门化
template <int a, int b> struct max<a, b> { ... };
template struct max{…};
然而,以下情况并非如此
template <int a> struct max<a> { ... };
template struct max{…};
因为基类模板至少需要两个模板参数。为什么不给它一个答案呢?它并没有从字面上回答这个问题,但这正是OP真正想要的,我guess@user463035818我不确定这一点,因为OP要求规则。他甚至知道如何通过添加另一个版本的主模板使他的解决方案工作ate.oh你是对的。我误读了这个问题,已经在想为什么top answers没有提到如何修复;)事实上我试过其他文章,主要模板有实现,它们工作得很好。所以我假设你的意思是“应该”这里有一个约定?@bigint,哦,是的,主要模板可以有一个实现。它是j在你的情况下,max::value
毫无意义,所以你应该不定义它。我已经修改了答案以澄清。@Frank One可以说max::value
应该是std::numeric\u limits::min()
。否则,基本模板应该至少需要一个模板参数。那么标准是否要求以下部分规范模板必须是主要模板的专用版本?@bigtit,我不明白你的意思。请详细说明。你说的是,因为基类模板至少需要两个模板参数。
所以我假设C++标准强制所有的模板在基础一个模板之后都是它的一个专门版本,因为在这种情况下,代码> max < /C>不是基本模板的更专业化版本吗?
template <int a, int b, int... cs> struct max { ... };
template <int a, int b> struct max<a, b> { ... };
template <int a> struct max<a> { ... };