首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++模板:无法匹配可变类模板中的最后一个模板

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

Stack Overflow用户
提问于 2018-06-07 04:01:19
回答 3查看 159关注 0票数 4

我正在学习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)。-结束注释

因此,我认为任何没有从基础/主要模板专门化的部分专门化模板都被认为是错误的,即使有时我们可以从正常的表达式生成一些非专门化形式的表达式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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> { ... };

因为基类模板至少需要两个模板参数。

票数 4
EN

Stack Overflow用户

发布于 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;
}
票数 2
EN

Stack Overflow用户

发布于 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> {};

...?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50728631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档