我在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
这里有一个最小可复制的例子:
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...>();}