1

我尝试使用 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| 错误:没有匹配 ג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 和 Analyzer.cpp|139| 注意:候选人是:data& data::operator=(data&)

4

2 回答 2

2

我认为您正在 C++03 模式下编译:请参阅Assignment operator in classes derived from or holderable copyable and moving types。如错误消息所示,您的赋值运算符是非常量的data& data::operator=(data&): ,这就是问题所在。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;
}

取决于你的需要。

于 2013-01-27T20:27:52.357 回答
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 中使用。

于 2013-01-27T20:27:55.733 回答