写了一个小程序,在一个const成员函数中访问了一个map成员,如下所示:
void CPlayerScore::GetScore(GAMERESULT res, RBScore & rbscore)const
{
rbscore = m_scoreTable[res];
}
m_scoreTable是一个map成员,结果编译时报错。
error C2678: 二进制“[” : 没有找到接受“const std::map<_Kty,_Ty>”类型的左操作数的运算符(或没有可接受的转换).
这个错误的根本原因是map的[]运算符不是const的,即如果key不存在时,map[key]会自动建立一个有序对<K,V>,其中V为类型的默认值.
相当于[]可能改变map类型的成员状态.
解决办法有3种:
1、是去掉函数的const属性,但是这样就改变设计意义了
2、在声明m_scoreTable时加上mutable限定符,如下所示
mutable map<GAMERESULT, RBScore> m_scoreTable;
第2个办法是网友benbear告诉我的,又学到了一招,呵呵
3、不改变原来的声明
代码改为
map<GAMERESULT, RBScore>:: const_ iterator it=m_score.find(res);
assert(it !=m_score.end();
rbscore = it->second;