C ++通过指针对象键访问map元素,给出了非法的操作错误

时间:2016-11-17 01:35:45

标签: c++ dictionary const

好的,这是我遇到问题的代码段(由于工作原因,类名已被更改)

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*]”是非法的。

任何人都知道为什么会这样?

2 个答案:

答案 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}}