关于 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] 的值,结果却多出一个默认的元素值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值