9

私は次の最小限のコードによって強調された奇妙な問題で頭を悩ませています:

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 ++標準に何かが欠けていますか?

4

1 に答える 1

6

2 つのパラメーター パックを使用するメソッドは、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

—終わりの例]

于 2012-12-06T22:24:07.130 に答える