我正在尝试在Visual Studio 2008下编译以下代码:
struct test
{
boost::container::vector<int> v1;
};
test v1, v3;
const test & v2 = v3;
v1 = v2;
我得到的错误是:
错误C2679:二进制'=':找不到带有'const test'类型右手操作数的运算符(或者没有可接受的转换)
可能是'test&amp; test :: operator =(test&amp;)'
在尝试匹配参数列表'(test,const test)'
当使用普通的std :: vector而不是boost :: container等效时,代码编译。我正在寻找答案为什么这段代码不能编译以及如何编译它。
答案 0 :(得分:3)
我发现了一个类似的问题: boost::container::vector fails to compile with C++03 compiler
我们观察到的行为似乎是为促进社区设计和了解的: Boost::move emulation limitations章“派生于或保留可复制和可移动类型的类中的赋值运算符”。
为了使主要问题中显示的代码能够工作,必须使用BOOST_COPYABLE_AND_MOVABLE宏将类声明为可复制和可移动的。此外,还需要明确定义复制赋值的const版本。更正了C ++ 03编译器的代码版本:
class test
{
private:
BOOST_COPYABLE_AND_MOVABLE( test );
public:
test& operator=(BOOST_COPY_ASSIGN_REF(test) p) // Copy assignment
{
v1 = p.v1;
return *this;
}
boost::container::vector<int> v1;
};
这些额外的类装饰可能确实变得烦人,特别是当代码库很大时。浏览代码并添加赋值运算符不是我想花时间的事情。