【发布时间】:2018-11-16 15:00:26
【问题描述】:
我正在学习 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):
[ 注意:类模板的部分特化由 查找主要类模板并然后考虑所有部分 该模板的专业化。如果使用声明命名一个类 模板,部分专业化之后引入 using-declaration 是有效可见的,因为主模板 可见(17.5.5)。 ——尾注]
所以我认为任何不从基本/主要模板特化的部分特化模板都被认为是错误的,即使有时我们可以从正常的表达形式生成一些非特化形式。
【问题讨论】:
标签: c++ c++11 templates variadic partial-ordering