Как передать карту как неизменную карту? - PullRequest
1 голос
/ 30 сентября 2019

У меня есть map, определяемый следующим образом:

typedef std::map<AsnIdentifier, AsnValue, AsnComparator> MibMap;

У меня есть одна такая карта, и я хочу передать ее другой функции, чтобы функция, которой она передана, не могла изменить ее.

void someFunc() {
   MibMap someMap = GetMibMap();
   otherFunc(someMap);
}

И подпись otherFunc могла бы быть такой для неизменности:

void otherFunc(const MibMap& someMap);

Но как только я использую find функцию карты, я получаю довольно многословную компиляциюошибка.

void otherFunc(const MibMap& someMap) {
   MibMap::iterator findVal = someMap.find(//pass the key to find);  //this does not compile
}

Как только я удалю const из сигнатуры метода, ошибка компиляции исчезнет. В чем причина? Я хочу сохранить карту неизменной, но в то же время я не уверен в этой ошибке компиляции.

Редактировать : ошибка компиляции выглядит следующим образом:

no suitable user-defined conversion from "std::_Tree_const_iterator... (and a whole long list)

1 Ответ

3 голосов
/ 30 сентября 2019

Если вы посмотрите на подходящую справочную документацию для std::map::find, вы увидите, что она имеет две перегрузки, которые отличаются 1. const-квалификацией неявного параметра this и 2тип возвращаемого значения:

iterator find( const Key& key );
const_iterator find( const Key& key ) const;

Отсюда ваша проблема должна быть очевидной: вы вызываете const -качественный find, но вы пытаетесь преобразовать его результат в MibMap::iterator,Измените тип findVal на const_iterator (или просто используйте auto), и он будет работать.

...