如何让GCC与VS编译器对typename关键字的检查规则保持一致
解决方案
方案1:统一强制要求typename(推荐,跨兼容性最好)
要让漏写typename的代码在两款编译器上都编译失败,只需给VS加一个额外编译开关即可:
你现有的VS配置(/std:c++17、/W4、/permissive-)已经可以触发C4643警告(提示模板中的依赖名称未用typename标识),只要再加编译选项/we4643,把这个警告升级为编译错误,漏写typename的代码就会直接编译失败。GCC的C++17模式默认就会对缺失typename的场景报编译错误,不用额外配置。
方案2:统一允许省略typename
如果希望漏写typename的代码在两款编译器上都能正常编译,有两种可选方案:
升级到C++20标准(无副作用,优先选择)
C++20标准已经支持隐式typename特性,只要上下文明确要求是类型的场景,就不需要手动写typename关键字:
- VS侧把C++标准切换为
/std:c++20即可原生支持 - GCC10及以上版本加编译选项
-std=c++20,就能正常编译省略typename的代码
保留C++17标准
如果必须使用C17标准,可以给GCC加编译选项-fpermissive,这个开关会把typename缺失的错误降级为警告,允许代码编译通过。不过注意该选项会放宽大量C语法合规性检查,可能放过其他不符合标准的代码,非必要不推荐用。
行为差异原因
VS2019在C17模式下默认提前实现了部分C20的隐式typename特性,所以不会对省略typename的场景报错,而GCC在C17模式下严格遵循C17标准要求,必须显式添加typename关键字。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

