-1

size_t の代わりに int を使用してベクトルのサイズを変更しているため、このエラー メッセージが表示されますか? それとも、コピー コンストラクターを宣言する必要があるためですか?

vector_name[pos] = MyClass_Objを使用するのではなく、 を使用して要素を割り当てていますvector_name.push_back(MyClass_Obj)

適切なデフォルト コンストラクタがありません:

コンパイル中の関数テンプレートのインスタンス化 'void std::_Uninit_def_fill_n<_FwdIt,_Diff,_Tval,_Alloc,Node>(_FwdIt,_Diff,const _Tval *,_Alloc &,_Valty *,std::_Nonscalar_ptr_iterator_tag)' への参照を参照してください

コンパイル中の関数テンプレートのインスタンス化 'void std::_Uninitialized_default_fill_n>(_FwdIt,_Diff,const _Tval *,_Alloc &)' への参照を参照してください

クラス テンプレート メンバ関数 'void std::vector<_Ty>::resize(unsigned int)' のコンパイル中

コンパイル中のクラス テンプレートのインスタンス化 'std::vector<_Ty>' への参照を参照してください

4

2 に答える 2

3

そのまま挿入してはいけません。 operator[]作成するためではなく、アクセスするためのものです。

あなたが未定義の行動の土地に入っている vec[pos]ところにいる場合。index に格納されている要素への参照を返します。その位置に要素がない場合、実装は自由に実行できます。pos >= vec.size()vec[pos]pos

コンパイラ エラーが発生しないように、コードがクラッシュして静かに燃焼することを期待しています。ただし、おそらく起こっているのは、ベクターの実装があなたを助けようとしていて、デフォルトで構築されたインスタンスの間size()およびインスタンスでスペースを埋めているposということです(そうしようとしています-それにはデフォルトのコンストラクターが存在する必要があります)。

つまり、「vector_name[pos] = MyClass_Obj を使用して要素を割り当てています」

の悪用ですoperator[]operator[]存在する要素にアクセスするためにのみ使用してください。新しい要素を追加するために使用しないでください。型のインスタンスではない何かへの参照を返そうとすると思うので、ベクトルの実装がそれで詰まらないことに実際に驚いています。

于 2012-05-27T01:25:21.460 に答える
3

に格納されたオブジェクトは、vector<>デフォルトで構築可能でなければなりません。あなたのものではありません。

class MyClass {
public:
  MyClass() { /* This ctor is required. */ }
};

int main () {
  std::vector<MyClass> vec_name;
  vec_name.resize(10); // or else this will fail.
}
于 2012-05-27T01:44:37.467 に答える