оператор карты [] операнды

Привет все у меня есть следующее в функции членства

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest);

и следующее объявление членской переменной

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;

Однако я получаю ошибку при компиляции (Intel Compiler 11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands
1>            operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ]
1>          vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                                                                    ^

Я знаю, что это получено, чтобы быть чем-то глупым, но я не вижу то, что я сделал неправильно.

ОБНОВЛЕНИЕ, которое я называю этим от функции членства константы, которая является, почему членский тип переменной является константой, таким образом, я думал, что что-то как следующее должно зафиксировать его:

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

Но провал... все еще та же ошибка.

13
задан Jamie Cook 5 May 2010 в 10:05
поделиться

2 ответа

типы операндов такие: const std::map< int ...

map::operator[] не работает с const map.

Я ответил на этот вопрос несколько дней назад.

map::operator[] немного странный. Он делает следующее:

  1. Ищет ключ.
  2. Если найден, возвращает его.
  3. Если нет, вставляет его и по умолчанию конструирует связанное с ним значение.
  4. Затем возвращает ссылку на новое значение.

Шаг 3 несовместим с постоянством. Вместо того, чтобы иметь два по-разному функционирующих оператора[] перегрузок, язык заставляет вас использовать map::find для const-объектов.

24
ответ дан 1 December 2019 в 20:28
поделиться

Прототипом [] является

 data_type& operator[](const key_type& k)

, т.е. неконстантная операция, поэтому вы не можете вызвать ее для члена из константной функции-члена.

Вы можете изменить код на:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
6
ответ дан 1 December 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: