Ваша проблема в том, что vector
, который вы пытаетесь вызвать push_back
, это const
.Это потому, что (начиная с C ++ 11) элементы std::set
доступны через const_iterators
, поскольку их изменение может изменить их сравнение и, следовательно, испортить set
.Чтобы решить эту проблему, у вас есть два варианта:
- Если
hDisponibles
не влияет на сравнение profesor
и не наносит большого ущерба вашей общей структуре, вы можете объявить его mutable
как это: mutable vector<int> hDisponibles;
.mutable
члены могут быть изменены, даже если структура, в которой они находятся, является const
- I, что не является опцией, вы должны удалить
profesor
из набора (во временную), сделатьpush_back
и вставьте его снова (будьте осторожны с аннулированием итератора).Конечно, это довольно дорого.
Ваш опубликованный код содержит дополнительную ошибку, поскольку hdisponsibles
является объектом, но push_back
вызывается так, как если бы он был указателем.Из вашего сообщения компилятора не похоже, что ошибка присутствует в вашем реальном коде, но на всякий случай должно быть:
(*itP).hDisponibles.push_back(0);
Редактировать: Найден раздел в стандартном черновике (тип значения совпадает с ключом для set
и multiset
: N3290 §23.2.4 / 6
итератор ассоциативного контейнера относится к категории двунаправленных итераторов. Для ассоциативных контейнеров, гдетип значения совпадает с типом ключа, итератор и const_iterator являются постоянными итераторами. Не определено, являются ли итераторы и const_iterator одинаковым типом. [Примечание: итератор и const_iterator имеют одинаковую семантику в этом случае, и итератор является конвертируемымк const_iterator. Пользователи могут избежать нарушения правила единого определения, всегда используя const_iterator в своих списках параметров функции. —endnote]