Visual Studio 2008 - boost::containers 和 error: "C2679: binary '=': no operator found"



我正在尝试在Visual Studio 2008下编译以下代码:

struct test
{
    boost::container::vector<int> v1;
};
test v1, v3;
const test & v2 = v3;
v1 = v2;
我得到的错误是:
错误C2679: binary '=':没有找到右操作数类型为'const test'的操作符(或者没有可接受的转换)
可以是'test &test::operator =(test &)'当尝试匹配参数列表'(test, const test)'

当使用普通std::vector来代替boost::container时,代码会编译。我正在寻找一个答案,为什么这个代码不编译,以及如何使它编译。

我发现了一个已经被问到的类似问题:使用c++ 03编译器编译boost::container::vector失败

看来我们观察到的行为是被设计并为boost社区所知的:Boost::move仿真限制章节"在派生或持有可复制和可移动类型的类中的赋值操作符"。

为了使主问题中显示的代码工作,必须使用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;
};

这些额外的类装饰确实会变得很烦人,尤其是当代码库很大的时候。在代码中爬行和添加赋值操作符并不是我想花费时间的事情。

相关内容

最新更新