error: expected primary-expression before ‘...’ token on gcc

error: expected primary-expression before ‘...’ token on gcc

我在 gcc 10.3 上遇到这个编译错误:

<source>:15:22: error: expected primary-expression before '...' token
   15 |     void g() { a.f<Cs...>();}
      |                      ^~~
<source>:15:22: error: expected ';' before '...' token
   15 |     void g() { a.f<Cs...>();}
      |                      ^~~
      |                      ;

事实证明,clang 实际上会告诉您哪里出了问题:

<source>:15:18: error: use 'template' keyword to treat 'f' as a dependent template name
    void g() { a.f<Cs...>();}
                 ^
                 template 

here's a minimum reproductible example :

template<typename ...Ts>
class A{
public:
    template<typename ...Cs>
    void f() {}
};

template<typename ...Ts>
class B{

    public:
    template<typename ...Cs>
    void g() { a.f<Cs...>();}

    private : 
    A<Ts...> a;
};

解决方案是使用 use 'template' 关键字将 'f' 视为依赖模板名称,如下所示:

template<typename ...Cs>
void g() { a.template f<Cs...>();}