4

VisualStudio2008で次のコードをコンパイルしようとしています。

struct test
{
    boost::container::vector<int> v1;
};
test v1, v3;
const test & v2 = v3;
v1 = v2;

私が得ているエラーは次のとおりです。
エラーC2679:バイナリ'=':タイプ'const test'の右側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)
' test&test :: operator =( test&)'引数リストと一致させようとしている間'(test、const test)'

boost::containerと同等の代わりに通常のstd::vectorが使用される場合、コードはコンパイルされます。このコードがコンパイルされない理由と、コンパイルする方法を探しています。

4

1 に答える 1

5

すでに尋ねられている同様の質問を見つけました: boost::container::vector fails to compile with C++03 compiler

私たちが観察している動作は設計されており、ブースト コミュニティに知られているようです: 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;
};

これらの追加のクラス装飾は、特にコードベースが大きい場合、実際に面倒になる可能性があります。コードをクロールして代入演算子を追加することは、私が時間を費やしたいことではありません。

于 2013-01-11T12:31:26.463 に答える