0

プレーヤー型の要素を格納する次のベクトルがあります。

std::vector<player> players;

次の関数を持つゲームと呼ばれるクラスで:

void game::removePlayer(string name) {
  vector<player>::iterator begin = players.begin();

  // find the player
  while (begin != players.end()) {
      if (begin->getName() == name) {
          break;
      }
      ++begin;
  }

  if (begin != players.end())
      players.erase(begin);

}

次のエラーが表示されます。

    1>------ Build started: Project: texas holdem, Configuration: Debug Win32 ------
1>  game.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2514): error C2582: 'operator =' function is unavailable in 'player'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2535) : see reference to function template instantiation '_OutIt std::_Move<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled
1>          with
1>          [
1>              _OutIt=player *,
1>              _InIt=player *
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1170) : see reference to function template instantiation '_OutIt std::_Move<player*,player*>(_InIt,_InIt,_OutIt)' being compiled
1>          with
1>          [
1>              _OutIt=player *,
1>              _InIt=player *
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1165) : while compiling class template member function 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>)'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<player,std::allocator<player>>,
1>              _Ty=player
1>          ]
1>          c:\vcprojects\texas holdem\texas holdem\game.h(29) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=player
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

ラインの削除

players.erase(begin);

エラーを修正しますが、なぜそれが起こっているのですか、どうすれば修正できますか?

4

3 に答える 3

1

Player & operator= (const Player & other)クラス Playerの代入演算子をオーバーロードする必要があります。これが必要なeraseのは、その引数がコピー可能である必要があるためです (削除後にベクトルの他の要素を再配置する必要があります)。

于 2012-08-14T00:40:29.103 に答える
1

何が起こっているかというと、ライブラリ コードは、playerイテレータの上の各配列要素を 1 スロット下に押し込むことによって、オブジェクトを削除します。そのために、operator= を使用して各オブジェクトをコピーします。どうやらクラスplayerにはその演算子がありません。

于 2012-08-14T00:41:59.163 に答える
0

問題は、Playerクラスが移動できないことです。Playerベクトルの中央からa を削除するには、Playerその後のすべての s をベクトル内で 1 スペース下に移動する必要があります。解決策の 1 つは、ベクターを使用しないことです。もう一つはPlayer可動式にすること。

于 2012-08-14T00:40:54.280 に答える