3 に答える
ベクトルの要素は次のとおりである必要があります。
- コピー可能、つまり、と互換性のあるコンストラクターがあり
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の場合:
クラス定義でコピー代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます。
どちらの場合も、すべての基本クラスとすべてのメンバーが、アクセス可能であいまいでない対応するコピーコンストラクターとそれぞれコピー代入演算子を持っている場合にのみ定義されます。
投稿したコードに問題はありません。実際のクラス(または基本クラス)が非公開の代入演算子を宣言しているようです。これは、クラスを割り当てることができないことを意味します。そのため、標準コンテナでの使用方法に制限があります。コピーできない場合、つまり非公開のコピーコンストラクターが宣言されている場合にも問題が発生します。
C ++ 03では、まったく使用できません。標準のコンテナで使用するには、コピー構築可能で割り当て可能にする必要があります。
C ++ 11では、vector
移動可能である限り、に保存できます。push_back
コピーできない場合は機能しない可能性があります。その場合は、emplace_back(1,2,3)
またはを使用できますpush_back(std::move(a))
。
クラス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
};