仅在GCC和Clang下出现的C++模板编译错误有什么解决方案?
问题根本原因
这个编译差异是C++标准对依赖名的解析规则导致的:GCC和Clang严格执行标准要求,MSVC、ICC则对这类语法做了非标准的放宽处理,你的代码本身不符合标准语法要求。
在模板函数ConvertPixel中:
realMagic的值依赖于模板参数TSourcePixelFormat,因此UnsignedBitAdjuster<realMagic, strongMagic>属于依赖类型(即类型需要等到模板实例化时才能最终确定)- 调用依赖类型的成员模板函数时,必须在成员函数名前添加
template关键字,否则编译器会默认把函数名后的<解析为小于运算符,而非模板参数列表的起始符,自然就会报后续数字是非法语法的错误。
修复方案
把报错行:
std::size_t actual = Adjuster::Adjust<0, 0>(value);
修改为:
std::size_t actual = Adjuster::template Adjust<0, 0>(value);
修改后的代码可以同时兼容GCC、Clang、MSVC、ICC四个编译器。
补充说明
你注释里写死constexpr std::size_t realMagic = 5时可以正常编译,是因为此时UnsignedBitAdjuster<5, strongMagic>属于非依赖类型,编译器可以直接确定Adjust是成员模板,不需要额外加template关键字提示。
内容的提问来源于stack exchange,提问作者Cygon
相关产品推荐
相关产品推荐

