网站 icp备案,wordpress头部信息,网页推广平台,游戏试玩平台代理今天在写一个简单的函数时#xff0c;编译时出现了如下的错误#xff1a; 这个很简单的函数是这样的#xff1a;
struct bundle_set
{uint32_t baseId;uint32_t endId;bool operator (const bundle_set a){return baseId a.baseId;}
};
在网上搜索到都是说什… 今天在写一个简单的函数时编译时出现了如下的错误 这个很简单的函数是这样的
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::mapuint32_t, std::setbundle_set。那为什么出错在那一行呢结合书上说的 const 函数旨在不修改类的成员而 auto set mLdpIdmMap[ldpIdx]; 就有可能修改了成员 mLdpIdmMap为什么呢因为std::map 的 [key] 操作符在没有找到 key 时会调用 key 类型的默认构造函数构造一个元素进行插入参考map [] 操作所以声明为 const 函数不能调用 map[] 操作符。解决办法当然就是去掉函数的 const 声明或者是用 map 的 find() 接口用 find() 接口更合适因为本意是想使用 map[key] 的值结果却多出一个默认的元素值。