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++ 都给出了相同的基本错误消息。他们基本上说在模板类中对 f() 的调用需要一个参数。

这是两个编译器中的错误,还是我在 C++ 标准中遗漏了什么?

4

1 回答 1

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

—结束示例]

于 2012-12-06T22:24:07.130 回答