Вопрос

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

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>                                                                    ^

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

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

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

Но никаких костей ... все еще ту же ошибка.

Это было полезно?

Решение

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

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

я ответил Это несколько дней назад.

Карта :: Оператор [] немного странно. Это делает это:

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

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

Другие советы

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

 data_type& operator[](const key_type& k)

Т.е. операция без константа, поэтому вы не можете вызвать его на члене из функции Const Cerfer.

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

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top