我正在摸索着一个由以下最小代码突出显示的奇怪问题:
struct A {
template <typename ...X, typename ...Y>
void f(X... a, Y...b) {
}
template <typename ...X>
void g(X...c) {
f<X...> (c...);
}
};
template <typename T>
struct B {
template <typename ...X, typename ...Y>
void f(X... a, Y...b) {
}
template <typename ...X>
void g(X...c) {
f<X...> (c...);
}
};
int main() {
A a;
a.g(); // Compiles without problem
B<int> b;
b.g(); // Compiler complains saying g() calls f<>() with 0 arguments while 1 is expected
}
g ++和clang ++都为第二种情况提供了相同的基本错误消息。 他们基本上说模板化类中对f()的调用需要一个参数。
这是两个编译器中的错误,还是我在C ++标准中遗漏了什么?
答案 0 :(得分:6)
根据14.1 [temp.param]第11段的规定,采用两个参数包的方法是非法的:
...除非可以从参数类型列表中推导出该模板参数,否则函数模板的模板参数包不能跟随另一个模板参数 函数模板或具有默认参数(14.8.2)。 [例如:
template<class T1 = int, class T2> class B; // error
// U cannot be neither deduced from the parameter-type-list nor specified
template<class... T, class... U> void f() { } // error
template<class... T, class U> void g() { } // error
-end example]