【1】复现问题

为了更精确的分析,先用最简单的示例复现此错误场景,代码如下:

#include <map>
#include <string>struct Section
{int id;std::string code;bool operator<(const Section& rhs){return id < rhs.id;}
};int main()
{std::map<Section, std::string> stdMap;stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));return 0;
}

编译结果:

如上,稳定重现。

【2】分析原因

如上示例,你可能会问,明显已经实现了运算符<的重载,为什么还编译错误呢?

注意仔细分析错误提示内容,从"const_Ty"字样不难看出编译器需要const支持。

编译器限定,运算符“<”内部只需读取对象成员变量,体现出大小比较的原则即可,禁止对成员变量进行修改。

所以,重载运算符“<”的实现必须要求const限定。

【3】解决方案

方案一:重载运算符“<”

方案二:友元函数

为了便于对比,两种方案代码放在一起,如下示例:

#include <map>
#include <string>struct Section
{int id;std::string code;#if 1// 方案一:重载运算符<bool operator<(const Section & rhs) const   // 注意:第二个const{return id < rhs.id;}
#else// 方案二:提供运算符<的友元函数friend bool operator<(Section const& lhs, Section const& rhs){return lhs.id < rhs.id;}
#endif
};int main()
{std::map<Section, std::string> stdMap;stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));return 0;
}

方案一、第11行:两个const作用说明:

(1)函数加上const后缀作用是限定函数内部实现对类成员变量具有只读权限。

(2)形参类型加上const,限定在这个函数内部对用来进行比较的“原版对象”成员做任何修改。

对于const的和非const的实参,函数都可以使用;如果不加,就只能接受非const的实参。

另外补充,引用的作用避免在函数调用时对实参的一次拷贝,提高了效率。

ERROR:C2678 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)相关推荐

  1. 错误 C2679 二进制“=”: 没有找到接受“const _Ty”类型的右操作数的运算符(或没有可接受的转换)的一种情况发生的错误

    错误 C2679 二进制"=": 没有找到接受"const _Ty"类型的右操作数的运算符(或没有可接受的转换 记录一下自己写代码出现的错误. 问题 写关于复数 ...

  2. C++ 没有找到接受const _Ty类型的左操作数的运算符

    在使用STL中的count(const )算法时报错没有找到接受const _Ty类型的左操作数的运算符, 原因是 使用自己创建的双向链表类没有重载左运算符== ,添加上重载运算即可. bool op ...

  3. 【C++】c++编译错误-- C2678 二进制“=”: 没有找到接受“_Ty”类型的左操作数的运算符(或没有可接受的转换)

    [C++]c++编译错误-- C2678 二进制"=": 没有找到接受"_Ty"类型的左操作数的运算符(或没有可接受的转换) 代码: //by 鸟哥 rever ...

  4. c++编译错误-- C2678 二进制“=”: 没有找到接受“_Ty”类型的左操作数的运算符(或没有可接受的转换)

    代码: //by 鸟哥 reverse引起的编译错误 //有疑问请留言或加群 1032082534 #include<iostream> #include<algorithm> ...

  5. QT中QSet容器报错: error: C2678: 二进制“==”: 没有找到接受“const Key类型的左操作数的运算符。

    该报错定位到qHash.h里.问题出在使用QSet存放了自定义的类. 解决方法:在类外重载(==)操作符和重写全局函数qHash. 具体如下: 头文件: //操作符重载(==) bool operat ...

  6. 二进制“==”: 没有找到接受“XX”类型的左操作数的运算符(或没有可接受的转换)

    项目场景: 自定义数据结构,进行内存数据的一些遍历等(QList等存储) 问题描述 因为出现==无法找到可接受的转换,那么你一定会像我一样,找==符号,一个项目里==符号那么多,要找到对应的对象==, ...

  7. C2679 二进制 没有找到接受 std::string 类型的右操作数的运算符(或没有可接受的转换)

    在VS上打代码,结果出现了上面这个错误 很奇怪,以前在其他IDE上这么写都没有问题,不知道为什么在VS写就出现了这个错误,我一开始以为是我的代码的问题.可是怎么想都没有想通. 甚至,我自己在main函 ...

  8. C2678 二进制“<“:没有找到接受“ const_Ty“类型的左操作数的运算符

    C2678 二进制"<":没有找到接受" const_Ty"类型的左操作数的运算符 运行c++程序时遇到上述错误,点击VS中的错误后发现无法定位到错误所在 ...

  9. Boost出现error C2678

    在使用Boost库的项目编译时,boost/asio/impl/executor.hpp(218)中出现如下错误: error C2678: 二进制"==": 没有找到接受&quo ...

最新文章

  1. 监控组件_分布式监控组件Cat,如何实现万亿级消息的高效存储?
  2. HTML5 文件域+FileReader 读取文件并上传到服务器(三)
  3. php umount强制,linux mount挂载与umount 卸载及“Device is busy”问题 | 璞玉(POOY)
  4. Eclipse配置Tomcat和JDK方法
  5. elasticsearch快照和恢复
  6. NVIDIA GPU持久模式是什么?(驱动程序持久性 Driver Persistence Daemon 守护程序)
  7. U3D的飞船太空射击例子中,使用coroutine
  8. java里面什么时候环境变量_Java的环境变量什么时候需要设置?
  9. 【Quartz】深入Job、JobDetail、JobDataMap、Trigger
  10. MySQL数据库中如何使用rand随机查询记录
  11. Python生态概览(三):图形用户界面开发库、游戏开发库、虚拟现实库、图形艺术库
  12. python将图片转动漫_python实现了照片转化为动漫模式
  13. 处理字符数据--排序规则(Collation)
  14. 服务器配置文档模板,服务器配置模板
  15. 关于DNF的多媒体包NPK文件的那些事儿(7) - IMGV5
  16. kd树 python实现_python K近邻算法的kd树实现
  17. 数显之家快讯:【SHIO世硕心语】2021年中国10大最赚钱的机会!
  18. 使用freemarker引擎动态生成word文件
  19. Maya v1.0.7.0 类似Rolan简洁小巧简单易用的快速启动工具
  20. Labelme使用——数据集标注详解

热门文章

  1. 最新发布!全球“灯塔工厂”再添5位中国新成员!
  2. 3D_systems_touch控制Dobot魔术师
  3. 2021年第16届首尔国际电视节圆满落幕
  4. 稳定币迎来“去中心化”转变,HAY为BNB Chain带来了什么
  5. 杭电1099_杭电数学题合集
  6. linux centos7和xshell在黑暗中摸索记
  7. 茶学领域如何用的上计算机,优秀茶学论文参考文献 茶学专著类参考文献哪里找...
  8. 感谢传智播客+C#.Net学习之旅
  9. innodb的索引下推
  10. 计算机网络战队名称大全,游戏战队名字大全要霸气