我有一个提升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='
为什么我不能像这样分配/存储迭代器?以及存储搜索结果迭代器的可能方法是什么?
答案 0 :(得分:2)
您必须跨索引
投影迭代器应该是
SlotLocations::iterator itr = project<Slot>(map, range.first);
答案 1 :(得分:2)
关于为什么投影不是通过隐式转换自动完成的第二个问题:实际上原因是不是 @sehe建议的那个(所有索引都是不同的,即使没有标记,它们的迭代器也是如此)保证是不同的类型),但是:投影是通过像
这样的表达式完成的it1 = c.project<X>(it0); // X is either a tag or an index number
需要用户提供容器这两个迭代器都属于:也就是说,您不能(通常)将it0
转换为it1
并保留信息仅it0
。