如何填充提升递归映射容器

How to populate boost recursive map container

本文关键字:递归 映射 何填充 填充      更新时间:2023-10-16

我尝试使用boost中的以下示例:

#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/boost/container/detail/tree.hpp|183|错误:与 ג((boost::container::container_detail::rbtree_node、std:::分配器>、data>、void*>*)this)->boost::container::container_detail::rbtree_node、std::分配器>、data>、void*>::m_data.boost::container::container_detail::p air、std:::allocator>、data>:::second = p->boost::container::container_detail::p air, std::allocator>, data>::secondג分析仪.cpp|139|注意:候选人是:data&data::operator=(data&)

我认为您正在C++03模式下编译:请参阅派生自或保存可复制和可移动类型的类中的赋值运算符。您的赋值运算符是非常量,如错误消息所示: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;
}

根据您的需求。

我从没想过这是可能的。但事实确实如此。尝试插入以下内容:

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

。它甚至可以在 C++03 中工作。