调用模板方法时出现‘operator<’无匹配项的问题求助
解决g++7.3中模板成员函数显式调用的operator<匹配错误
你遇到的这个问题我之前也碰到过,g++ 7.x系列在处理依赖模板参数的成员模板函数调用时,确实存在语法解析的小坑。先看报错的核心代码位置:
template<typename T> class B { public: static inline void start(void) noexcept { // 就是这行代码引发的错误 T::get().start<modes_t::m1>(); } };
问题根源
因为T是模板参数,T::get()返回的是一个依赖于模板参数的对象(这里是A&),在这种依赖上下文里,g++7.3的编译器无法自动识别start是一个模板成员函数——它会把后面的<当成小于运算符来解析,自然找不到对应的operator<重载,从而抛出错误。
修复方案
你需要用template关键字显式告诉编译器:start是一个模板函数,这样编译器就会把<>当成模板参数列表处理,而不是比较运算符。修改后的B类代码如下:
template<typename T> class B { public: static inline void start(void) noexcept { // 添加template关键字限定start为模板函数 T::get().template start<modes_t::m1>(); } };
验证效果
修改后用g7.3编译(比如执行命令g++ -std=c++17 your_code.cpp -o output),就能正常通过编译了。这其实是C标准的明确要求:在依赖于模板参数的对象上调用模板成员函数时,必须显式使用template关键字消除语法歧义,只是旧版本g++对这个规则的执行更严格。
内容的提问来源于stack exchange,提问作者byteunit
相关产品推荐
相关产品推荐

