C++17正常编译的模板代码迁移至C++20 GCC11报错如何无修改解决
GCC 11 C++20模式类模板构造函数语法报错规避方案
问题场景
原有代码在-std=c++17编译标准下运行正常,切换到C++20标准后,仅在GCC 11.1版本下触发编译错误,涉及第三方库不可修改的代码如下:
template<typename T> struct S { S<T>(){}; };
报错信息为:
error expected unqualified-id before ')' token line 3
问题原因
C++标准明确要求,类模板内部定义构造函数时,构造函数标识符只能使用注入类名(无模板参数后缀的S),不允许显式携带模板参数列表写作S<T>。
- C++17及更早版本中GCC对该非标准语法做了兼容支持,不会触发报错
- GCC 11.1的C++20模式收紧了语法检查规则,默认不再兼容该写法,因此抛出编译错误
- Clang所有版本均兼容该非标准写法,因此不会触发报错
无需修改源码的规避方案
- 全局添加
-fpermissive编译参数:该参数会降低GCC语法检查严格度,允许该类非标准语法通过编译,是改动最小的解决方案 - 单独为第三方库配置编译参数:如果不想影响项目自有代码的语法检查,可在构建脚本中仅针对该第三方库的编译规则添加
-fpermissive参数,其余代码保持原有检查规则 - 降级GCC版本到10.x及更早版本:GCC 10及更低版本的C++20模式仍兼容该非标准写法,不会触发报错
内容的提问来源于stack exchange,提问作者Saad Rami
相关产品推荐
相关产品推荐

