如何填充boost递归映射容器

时间:2013-01-27 20:19:34

标签: c++ boost map

我尝试使用boost中的以下example

#include <boost/container/map.hpp>
struct data
{
    std::string label;
    //A map holding still undefined 'data'
    boost::container::map<std::string, data> m_;
};

int main(int argc, char* argv[])
{
    data d,d1,d2;
    d.m_["hello"] = d1;
    return 0;
}

不幸的是它没有编译,我无法理解为什么。

编译器消息(只是它的结尾): ../../ 3d_party_4_5_8 / boost_1_49_0 /升压/集装箱/细节/ tree.hpp | 183 |错误:גoperator =ג在ג中不匹配((boost :: container :: container_detail :: rbtree_node,std :: allocator&gt;,data&gt;,void *&gt; *)this) - &gt; boost :: container :: container_detail :: rbtree_node,std :: allocator&gt;,data&gt;,void *&gt; :: m_data.boost :: container :: container_detail :: pair,std :: allocator&gt;,data&gt; :: second = p-&gt ; boost :: container :: container_detail :: pair,std :: allocator&gt;,data&gt; :: secondג Analyzer.cpp | 139 |注意:候选人是:数据&amp;数据::运算=(数据&安培;)

2 个答案:

答案 0 :(得分:2)

我认为您正在使用C ++ 03模式进行编译: 请参阅Assignment operator in classes derived from or holding copyable and movable types。您的赋值运算符是非常量,如错误消息中所示:data& data::operator=(data&),这就是问题所在。 boost::container模拟C ++ 03编译器中的移动语义,为此,定义了非const复制构造函数。一种可能的解决方案是将以下内容添加到data

data& operator=(data x)
{
    std::swap(*this, x); 
    return *this;
}

data& operator=(const data& x)
{
    label = x.label 
    return *this;
}

取决于您的需求。

答案 1 :(得分:1)

我从没想过那是可能的。但确实如此。试试这个插入:

//...
int main(int argc, char* argv[])
{
    data d,d1,d2;
    d.m_.insert( std::make_pair(std::string("hello"), d1) ) ;
    return 0;
}
// ...

......即使在C ++ 03中也能正常工作。