2016-11-17 2 views
0

Ok вот фрагмент код, который я имею проблему с (именем класса был изменен из-за работу причину)C++ доступ к карте элементу с помощью ключа объекта указателя дает ошибку о недопустимой операции

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. 

Error: The operation " const std::map<A*, std::pair<int, B*>, std::less<A*>, std::allocator<std::pair<A*const, std::pair<int, B*>>>>[A*] " is illegal.

кого есть идея, почему это так?

+1

Это потому, что это недопустимо C++. 'B *' недействителен C++. –

+0

Извините, я не понимаю, почему вы говорите, что это неверно. – Mox

+0

aMap [a] должен вернуть пару, а секундомер должен получить доступ к B * – Mox

ответ

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.

+0

@Mox Нет вообще. Мы, начинающие, должны помогать друг другу. :) –

+0

К сожалению, я не могу использовать at(), потому что компилятор, который у меня здесь, старше этого. поэтому только C++ 98 доступен для меня – Mox

+0

@Mox См. мое обновленное сообщение. –

1

aMap is const, но 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; 
+0

, но get getAMap() возвращает const std :: map > & type. так не должен ли мой aMap быть const тоже? – Mox

+0

@Mox Затем вы не можете вызвать 'operator []' на возвращенной карте напрямую. Вы можете сделать копию, затем называть 'operator []' на ней, как показал мой образец, или использовать 'at()', как ответил @ladfromMoscow; но обратите внимание, что его поведение не такое же, как 'operator []'. Это зависит от ваших потребностей, если вы не хотите вставлять значение, если ключ не существует, тогда вы должны использовать 'at()' вместо 'operator []'. – songyuanyao

+0

Я дам ваше решение выстрелом =) – Mox