私は次の最小限のコードによって強調された奇妙な問題で頭を悩ませています:
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++はどちらも、2番目のケースで同じ基本的なエラーメッセージを表示します。彼らは基本的に、テンプレート化されたクラス内でのf()の呼び出しには1つの引数が必要であると言っています。
これは両方のコンパイラのバグですか、それともC ++標準に何かが欠けていますか?