好的,这是我遇到问题的代码段(由于工作原因,类名已被更改)
const std::map<A*, std::pair<int, B*> > &aMap = ot->getAMap();
A *a = getAFromSomewhere();
B* b = aMap[a].second; //The line that the compilation error points to.
错误:操作“
const std::map<A*, std::pair<int, B*>, std::less<A*>, std::allocator<std::pair<A*const, std::pair<int, B*>>>>[A*]
”是非法的。
任何人都知道为什么会这样?
答案 0 :(得分:2)
类std::map
的下标运算符声明为
T& operator[](const key_type& x);
T& operator[](key_type&& x);
正如您所看到的那样,它是为类的非常量对象声明的,因为如果地图中没有给定键的对象,那么它就是由运算符创建的。
由于常量引用
,您的对象是不变的const std::map<A*, std::pair<int, B*> > &aMap = ot->getAMap();
^^^^^
您应该使用为常量对象声明的成员函数at
。
const T& at(const key_type& x) const;
^^^^^
如果您有一个不支持C ++ 2011的旧编译器,那么您可以使用成员函数find
。
答案 1 :(得分:1)
std::map::operator[]
是const,但是std::map<A*, std::pair<int, B*> > aMap = ot->getAMap(); // aMap is non-const, copied from the returned map
A *a = getAFromSomewhere();
B *b = aMap[a].second;
是非const成员函数(重载),不能在const对象上调用。
将它与非const对象一起使用将起作用,例如
{{1}}