我尝试使用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;数据::运算=(数据&安培;)
答案 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中也能正常工作。