C++, доступ к элементу std::map через ссылку const

У меня проблема с const. скажем, у меня есть:

class A{
    friend std::ostream& operator<<(std::ostream& os,const A& myObj);

   private:
    std::map<int,int> someMap;
    int someInteger;
 };
 std::ostream& operator<<(std::ostream& os,const A& myObj){
  os<<myObj.someInteger<<std::endl;
  os<<myObj.someMap[0]<<std::endl;
  }

Такой код генерирует ошибку при компиляции из-за конфликта const с картой (если я прокомментирую строку, печатающую значение карты, все в порядке), и если я избавлюсь от 'const' в прототипе функции, все в порядке. Я действительно не вижу, где проблема..

Любая помощь, пожалуйста?


person volatile    schedule 20.12.2012    source источник
comment
Я думаю, вы имели в виду myObj.someMap[0].   -  person chris    schedule 20.12.2012
comment
os<<myObj<<someMap[0] должно быть os<<myObj.someMap[0], чтобы конкретизировать то, что сказал Крис.   -  person WhozCraig    schedule 20.12.2012


Ответы (1)


std::map::operator[] не является константой, поскольку вставляет элемент, если он еще не вставлен. существовать. В С++ 11 вместо этого вы можете использовать std::map::at():

myObj.someMap.at(0)

В противном случае вы можете сначала проверить, существует ли элемент, используя std::map::find,

if (myObj.find(0) != myObj.end())
{
  // element with key 0 exists in map
} else 
{
  // do something else.
}
person juanchopanza    schedule 20.12.2012
comment
Обратите внимание, что std::map::at() встроен в gcc начиная с 2003 года. - person Andrew Prock; 20.12.2012
comment
БОЛЬШОЕ СПАСИБО. Я понимаю проблему. И оператор at хорошо работает с моим g++!! - person volatile; 20.12.2012