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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (242)

我正在学习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...>: ...

所以我的问题是:

为什么max<a>无法匹配?是否有处理这方面的规则或标准?

提问于
用户回答回答于

之所以会出现此错误,是因为模板的每次调用都必须首先匹配基本模板,而专门化只会在该模板之后启动。

基模板应该匹配任意数量的参数,并且没有实现(因为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;
}
用户回答回答于
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> {};

.?

扫码关注云+社区

领取腾讯云代金券