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

摘要:
注意仔细分析错误提示内容,从"const_Ty"字样不难看出编译器需要const支持。所以,重载运算符“˂”的实现必须要求const限定。形参类型加上const,限定在这个函数内部对用来进行比较的“原版对象”成员做任何修改。对于const的和非const的实参,函数都可以使用;如果不加,就只能接受非const的实参。详情参见随笔《ERROR:2676》goodgoodstudy,daydayup.顺序选择循环总结

【1】复现问题

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

1 #include <map>
2 #include <string>
3 
4 structSection
5 {
6     intid;
7     std::stringcode;
8 
9     bool operator<(const Section&rhs)
10 {
11         return id <rhs.id;
12 }
13 };
14 
15 intmain()
16 {
17     std::map<Section, std::string>stdMap;
18     stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
19     stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
20     stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));
21 
22     return 0;
23 }

编译结果:

ERROR:C2678 二进制“&lt;”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)第1张

如上,稳定重现。

【2】分析原因

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

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

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

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

【3】解决方案

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

方案二:友元函数

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

1 #include <map>
2 #include <string>
3 
4 structSection
5 {
6     intid;
7     std::stringcode;
8 
9 #if 1
10     //方案一:重载运算符<
11     bool operator<(const Section & rhs) const   //注意:第二个const
12 {
13         return id <rhs.id;
14 }
15 #else
16     //方案二:提供运算符<的友元函数
17     friend bool operator<(Section const& lhs, Section const&rhs)
18 {
19         return lhs.id <rhs.id;
20 }
21 #endif
22 };
23 
24 intmain()
25 {
26     std::map<Section, std::string>stdMap;
27     stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
28     stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
29     stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));
30 
31     return 0;
32 }

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

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

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

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

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

备注:关于const关键字,建议参见随笔《const关键字

方案二、参见随笔《友元》理解。

【4】触类旁通

如果是std::vector容器中存储自定义类型,又会有什么约束呢?

详情参见随笔《ERROR:2676

good good study, day day up.

顺序 选择 循环 总结

免责声明:文章转载自《ERROR:C2678 二进制“&amp;lt;”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ALSA声卡07_分析调用过程_学习笔记C# WinForm获取当前路径汇总下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react学习

1.state属性 state顾名思义就是状态,它只是用来控制这个组件本身自己的状态,我们可以用state来完成对行为的控制、数据的更新、界面的渲染. setState更新是异步的,事件处理过程 setState 不会同步更新 this.state, React 控制之外的情况, setState 会同步更新 this.state 总结:尽量少地用 sta...

ant design vue 获取上传图片的像素

获取图片的像素大小,使用上传文件之前的钩子 beforeUpload,参数为上传的文件。 <a-upload name="file" list-type="picture-card" :show-upload-list="false" :multiple="false" :b...

axios 学习文档

什么是 axios? Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。axios Github 特性 从浏览器中创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 Promise API 拦截请求和响应 转换请求数据和响应数据 取消请求 自动转换 JSON 数据 客户端支持...

boost之ThreadPool

threadpool是基于boost库实现的一个线程池子库,但线程池实现起来不是很复杂。我们从threadpool中又能学到什么东西呢? 它是基于boost库实现的,如果大家对boost库有兴趣,看看一个简单的实现还是可以学到点东西的。 threadpool基本功能 1、任务封装,包括普通任务(task_func)和优先级任务(prio_task_fun...

Lua5.1中的API函数

Lua5.1中的API函数 lua_State*luaL_newstate()Lua脚本的编译执行是相互独立的,在不同的线程上执行。通过luaL_newstate()函数可以申请一个虚拟机,返回指针类型 lua_State。今后其他所有Lua Api函数的调用都需要此指针作为第一参数,用来指定某个虚拟机。lua_State* L = luaL_newst...

vue后台管理系统项目

项目介绍1.项目根目录文件 2.源码子目录结构 3.api目录 4.assets目录 5.components目录 6.mixins目录 7.permission目录 8.router目录 9.store目录 10.styles目录 11.utils目录 项目文件介绍1.安装element-ui组件实现按需加载 // 1.1.npm...