是否可以使用QMap< QString, boost::multi_index_container<...> >
等结构?
一方面,我们有private:
BOOST_COPYABLE_AND_MOVABLE(multi_index_container)
在容器声明中。它应该告诉我们不要把multi_index_container&lt;&gt;进入其他类似stl的容器。
另一方面,这种结构
QMap< QString, boost::multi_index_container<...> > _map;
map.insert("bla-bla", container1);
...
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
//keyVal corresponds to one for the multi_index_container instance
使用Visual Studio 2012编译(+ update4 + boost v1.55 + qt v4.8.5)。
实验上发现:
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
使tmp
处理已删除的数据。
而
auto tmp = _map.value(QString("bla-bla"));
auto tmp_1 = tmp.get<keyVal>();
为tmp_1
留下有效数据。
如果我们需要将它放在另一个容器中,是否有人知道boost::multi_index_container<>
的正确治疗方法是什么?
Qt5.3有什么不同吗?
答案 0 :(得分:3)
正如你在QMap的文档中看到的那样:
const T QMap::value(const Key & key, const T & defaultValue = T()) const
该值按值返回,而不是按引用返回。除了对大值(例如多索引容器,可能?)效率非常低之外,它还会返回一个临时值。
现在,get<keyVal>();
确实返回对第一个索引的引用,但它是属于临时索引的索引,在临时索引结束时死亡表达
要获得可修改的参考,请使用
T & QMap::operator[](const Key & key)
现在你可以:
auto& tmp = _map[QString("bla-bla")].get<keyVal>();
请注意 &
。
答案 1 :(得分:1)
添加@sehe关于如何检索引用而不是临时值的答案,boost::multi_index_container
是 copyable and movable。您引用的此BOOST_COPYABLE_AND_MOVABLE
宏必须放在类私有部分(如指定here),但这不会影响复制/移动ctors的可见性。故事的道德:在深入研究代码之前咨询文档。
答案 2 :(得分:-4)
在我的特定情况下,问题是编译器使用const T operator[](const Key & key) const
而不是T & operator[](const Key & key)
,因为类的方法是const
,并且地图是类的字段。