当前位置: 首页 > news >正文

关于 passing ‘const xx’ as ‘this’ argument of 的错误

        今天在写一个简单的函数时,编译时出现了如下的错误:

这个很简单的函数是这样的:

struct bundle_set
{uint32_t baseId;uint32_t endId;bool operator< (const bundle_set &a){return baseId < a.baseId;}
};

在网上搜索到都是说什么 “一个const对象不能调用非const成员函数” 并不太理解是什么意思。以前看书的时候,书上说是如果在函数后面加上 const 表明这个函数不会去修改类成员,光从这个函数来看确实没有修改成员,但为何需要声明为 const 才能编译过呢?这个还没理解,以后知道了才更新吧。然后我们再看下面这个函数:


void idm_bundle_manager::dumpByLdpIdx(uint32_t ldpIdx)const
{if(!mLdpIdmMap.empty()){printf("ldpidx = %u\n", ldpIdx);auto set = mLdpIdmMap[ldpIdx];auto ret = mLdpIdmMap.find(ldpIdx);if(ret != mLdpIdmMap.end()){for(auto ite : ret->second){printf("%u %u\n", ite.baseId, ite.endId);}}}
}

编译错误应该跟开头那个是一样的意思。错误表明在224行,即 auto set = mLdpIdmMap[ldpIdx]; 这个 mLdpIdmMap 的类型为 std::map<uint32_t, std::set<bundle_set>>。那为什么出错在那一行呢?结合书上说的 const 函数旨在不修改类的成员,而 auto set = mLdpIdmMap[ldpIdx]; 就有可能修改了成员 mLdpIdmMap,为什么呢?因为std::map 的 [key] 操作符在没有找到 key 时,会调用 key 类型的默认构造函数构造一个元素进行插入,参考:map [] 操作,所以声明为 const 函数不能调用 map[] 操作符。解决办法当然就是去掉函数的 const 声明,或者是用 map 的 find() 接口,用 find() 接口更合适,因为本意是想使用 map[key] 的值,结果却多出一个默认的元素值。

 

http://www.lryc.cn/news/199259.html

相关文章:

  • 数据结构和算法(13):优先级队列
  • 面试经典150题——Day15
  • web APIs——第一天(上)
  • 【Leetcode】215. 数组中的第K个最大元素
  • 服务器数据恢复-RAID5常见故障的数据恢复方案
  • 12个VIM编辑器的高级玩法
  • ⽜客论坛的笔记
  • JS逆向分析某枝网的HMAC加密、wasm模块加密
  • 论坛介绍|COSCon'23开源商业(V)
  • 在word、ppt、excel编辑软件标题栏顶部左上角加入自定义功能:另存为、导出PDF
  • Flink学习笔记(三):Flink四种执行图
  • 堆-----数据结构
  • 震撼登场 | 拓世科技集团新品亮相成为2023世界VR产业大会全场焦点
  • 后端接口的查询方式
  • Maven首次安装配置
  • 使用html2canvas将html转pdf,由于table表的水平和竖直有滚动条导致显示不全(或者有空白)
  • EDID详解
  • 浅谈云原生
  • 【K8S】Kubernetes
  • 面试题 01.01. 判定字符是否唯一
  • C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)
  • 38 WEB漏洞-反序列化之PHPJAVA全解(下)
  • LeetCode 面试题 10.10. 数字流的秩
  • Vue3项目上线打包优化
  • 【算法题】2525. 根据规则将箱子分类
  • python字典
  • thinkphp队列的使用?
  • 【数据结构】排序--归并排序
  • 批量修改视频尺寸:简单易用的视频剪辑软件教程
  • 四川云汇优想:短视频矩阵运营方案