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...>();}
我在 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...>();}