【问题标题】:How to populate boost recursive map container如何填充提升递归地图容器
【发布时间】:2013-01-11 04:29:02
【问题描述】:

我尝试使用 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/boost/container/detail/tree.hpp|183|错误:没有匹配 גoperator=ג in ג((boost::container::container_detail::rbtree_node, std::allocator >, data>, void*>*)this)->boost::container::container_detail:: rbtree_node, std::allocator >, data>, void*>::m_data.boost::container::container_detail::pair, std::allocator >, data>::second = p->boost::container:: container_detail::pair, std::allocator >, data>::second 分析器.cpp|139|注意:候选人是:data& data::operator=(data&)

【问题讨论】:

  • 您是否想过在您的问题中包含编译器错误消息可能会有所帮助?!
  • #include &lt;string&gt;了吗?
  • 你是在C++03模式下编译吗?
  • 是的,我不能使用 c++11,但我在这里没有看到 c++11 还是我遗漏了什么?
  • @Ezra: boost::container 在 C++03 模式下使用移动仿真,这是它的限制之一(请参阅我的答案中的链接)。

标签: c++ boost map


【解决方案1】:

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

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

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

取决于您的需求。

【讨论】:

    【解决方案2】:

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

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

    ...它甚至可以在 C++03 中使用。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2011-07-21
      相关资源
      最近更新 更多