Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板:无法匹配变量类模板中的最后一个模板_C++_C++11_Templates_Variadic_Partial Ordering - Fatal编程技术网

C++ C++;模板:无法匹配变量类模板中的最后一个模板

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)>

我正在学习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;
}
#包括
#包括
模板
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> { ... };