3
4

3 に答える 3

19

ベクトルの要素は次のとおりである必要があります。

  • コピー可能、つまり、と互換性のあるコンストラクターがありT(const T&)ます。
  • 割り当て可能、つまり、とoperator=互換性がありoperator=(const T&)ます。
  • デフォルト-構築可能、つまり、と互換性のあるコンストラクターがありT()ます。

エラーは割り当て可能な要件に違反していることを示していますが、コードはそうではないことを示唆しています。手動で定義されていない限り、すべてのクラスはコンパイラによって生成されたコピーコンストラクタと代入演算子を取得するため、クラスは実際に代入可能である必要があります。ただし、デフォルトのコンストラクターは、他のコンストラクターが定義されていない場合にのみ暗黙的に生成されます。コンストラクターがあるため、デフォルトのコンストラクターも定義する必要があります。

Mikeが指摘したように、要件はC ++ 11でのみ移動可能に減らされましたが、それぞれのC ++ 11機能をすでにサポートしているコンパイラが必要であり、それらの機能を有効にする必要があります。ただし、エラー内のパスは、C++11より前のVisualStudio9.0、別名Visual Studio 2008を示しているため、制限が適用されます。


コピー可能および割り当て可能は、それらを壊さない限り、デフォルトで満たされます。仕様によると、

  • 12.8.4では:

    クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。

  • 12.8.10の場合:

    クラス定義でコピー代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます。

どちらの場合も、すべての基本クラスとすべてのメンバーが、アクセス可能であいまいでない対応するコピーコンストラクターとそれぞれコピー代入演算子を持っている場合にのみ定義されます。

于 2012-07-03T11:03:23.270 に答える
5

投稿したコードに問題はありません。実際のクラス(または基本クラス)が非公開の代入演算子を宣言しているようです。これは、クラスを割り当てることができないことを意味します。そのため、標準コンテナでの使用方法に制限があります。コピーできない場合、つまり非公開のコピーコンストラクターが宣言されている場合にも問題が発生します。

C ++ 03では、まったく使用できません。標準のコンテナで使用するには、コピー構築可能で割り当て可能にする必要があります。

C ++ 11では、vector移動可能である限り、に保存できます。push_backコピーできない場合は機能しない可能性があります。その場合は、emplace_back(1,2,3)またはを使用できますpush_back(std::move(a))

于 2012-07-03T11:05:51.570 に答える
1

クラスAにoperator=とcopy-constructorを追加する必要があります

class A 
{
    public:
    A(int a,int b,int c);
    A(const A& element);
    A& operator=(const A& element);     //which needs definition
};
于 2012-07-03T11:02:05.683 に答える