GCC编译模板代码报错:expected primary-expression before ')' token求助
解决GCC模板中成员模板调用的编译错误
这是典型的C模板依赖名称解析问题,GCC在这里的语法检查比Clang更严格,严格遵循了C标准的要求~
问题原因
当你在模板类中,通过一个依赖于模板参数的对象(这里this->asdf的类型std::shared_ptr<T>依赖于模板参数T)调用它的成员函数模板时,编译器在解析模板定义阶段无法确定get_value是一个成员函数模板还是普通的成员变量/函数。GCC会严格要求你显式标记出这是一个模板调用,而Clang则做了更宽松的推断,所以没报错。
修复方案
只需要在get_value前加上template关键字,明确告诉编译器这是一个成员模板调用:
template <uint First, uint Second, typename T> struct Thing { std::shared_ptr<T> asdf; uint get() const { // 加上template关键字消除歧义 this->asdf->template get_value<First,Second>(); } };
补充说明
这个template关键字是C++标准规定的必要语法,用于在依赖名称中区分模板调用和普通的小于运算符。修改后,GCC 7可以正常编译,同时Clang也不会产生新的警告,完全兼容两个编译器的要求。
内容的提问来源于stack exchange,提问作者Brian Vandenberg
相关产品推荐
相关产品推荐

