Повысьте многоиндексный порядок упорядоченных итераторов

У меня есть импульс 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='

Почему я не могу назначить / сохранить итераторы, как это? А как можно сохранить итератор результатов поиска?

2

Решение

Вы должны проецировать итераторы по индексам

Должно быть как

 SlotLocations::iterator itr = project<Slot>(map, range.first);
2

Другие решения

Что касается вашего второго вопроса о том, почему проекция не выполняется автоматически посредством неявных преобразований: на самом деле причина в том, не тот, который предложен @sehe (все индексы различны, даже если нет тегов, а их итераторы гарантированно разных типов), но это: проекция осуществляется с помощью выражения типа

it1 =  c.project<X>(it0); // X is either a tag or an index number

который должен предоставить пользователь контейнер оба итератора принадлежат: то есть, вы не можете (вообще) конвертировать из it0 в it1 с информацией, хранящейся it0 в одиночестве.

2

По вопросам рекламы [email protected]