我正在学习 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 命名类模板,则在 using-declaration 之后引入的部分特化有效可见,因为主模板是可见的 (17.5.5)。——尾注]
所以我认为任何不从基本/主要模板专门化的部分专门化模板都被认为是错误的,即使有时我们可以从正常的表达形式生成一些非专门化形式。