У меня есть импульс multi_index_container, хранящий кучу мест со следующим индексом
boost::multi_index::indexed_by<
boost::multi_index::ordered_unique<
boost::multi_index::tag<Slot>,
boost::multi_index::identity<SlotData>
>, //ordered_unique
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<Level>,
SlotData::ExtractZ
>, // ordered_non_unique
...//index by
.//typedef as SlotLocations
В этом определении я считаю, что индекс по умолчанию будет ordered_unique
основанный на Slot
, Позже у меня есть итератор SlotLocations::iterator
что я хочу использовать, чтобы сохранить результат поиска на основе Level
который ordered_non_unique
:
typedef SlotLocations::index<Level>::iterator MIterator;
std::pair<MIterator, MIterator> range = map.get<Level>().range(..some conds..);
SlotLocations::iterator itr = range.first; //error
Ранжированный поиск работает и возвращает желаемый результат, сохраненный в range
, однако этот код не будет компилироваться с помеченной строкой, выдавая следующую ошибку:
error: no match for 'operator='
Почему я не могу назначить / сохранить итераторы, как это? А как можно сохранить итератор результатов поиска?
Вы должны проецировать итераторы по индексам
Должно быть как
SlotLocations::iterator itr = project<Slot>(map, range.first);
Что касается вашего второго вопроса о том, почему проекция не выполняется автоматически посредством неявных преобразований: на самом деле причина в том, не тот, который предложен @sehe (все индексы различны, даже если нет тегов, а их итераторы гарантированно разных типов), но это: проекция осуществляется с помощью выражения типа
it1 = c.project<X>(it0); // X is either a tag or an index number
который должен предоставить пользователь контейнер оба итератора принадлежат: то есть, вы не можете (вообще) конвертировать из it0
в it1
с информацией, хранящейся it0
в одиночестве.