今天在写一个简单的函数时,编译时出现了如下的错误:
这个很简单的函数是这样的:
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] 的值,结果却多出一个默认的元素值。