0

単純な消去を実行しようとしていますが、エラーが発生し続けます。

これが私の消去のコードスニペットです:

std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++)
{
    if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
    {
        onScreen.push_back(*iterMines);
        iterMines = onScreen.erase(iterMines);
        iterMines--;
    }
}

コンパイラメッセージが表示され続けます:

1>c:\users\owner\desktop\bosconian\code\bosconian\environment.cpp(158) : error C2664: 'std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::erase(std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'std::list<_Ty>::_Iterator<_Secure_validation>' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1>        with
1>        [
1>            _Ty=SpaceObject *,
1>            _Secure_validation=true
1>        ]
1>        and
1>        [
1>            _Ty=Mine *,
1>            _Secure_validation=true
1>        ]
1>        and
1>        [
1>            _Ty=SpaceObject *,
1>            _Secure_validation=true
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

正しいイテレータを与えていると信じているので、私は困惑しています。

MineはSpaceObjectのサブクラスです(第2世代のサブクラスです)

これはそれと関係がありますか?そして、どうすれば修正できますか?

4

3 に答える 3

4

問題は、地雷のイテレータをonScreenリストのイテレータとして使用しようとしていることです。これは機能しません。

onScreen.erase(iterMines)の代わりにmines.erase(iterMines)を呼び出すつもりでしたか?

于 2008-12-17T02:36:27.687 に答える
2
std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++)
{
        if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
        {
                onScreen.push_back(*iterMines);
                iterMines = onScreen.erase(iterMines);
                iterMines--;
        }
}

1つの実際の問題と1つの可能な解決策:

erase削除された要素の次のイテレータを提供します。したがって、最初にいて消去すると、新しい始まりが与えられます。その後、イテレータをデクリメントすると、開始前にデクリメントします。そして、これは無効です。iterMines++ループの本体にをより適切に考慮します。

std::list<Mine*>::iterator iterMines = mines.begin();
for(int i = oldSizeOfMines; i >0 ; i--)
{
        if(player->distanceFrom(*iterMines) < radiusOfOnScreen)
        {
                onScreen.push_back(*iterMines);
                iterMines = mines.erase(iterMines); // change to mines!!
        } else { 
            ++iterMines; // better to use ++it instead of it++
        }
}

イテレータがそれ自体のコピーを作成するときに舞台裏で何をするかわからないので、そのためにプリインクリメントを使用することをお勧めします。++itは新しいイテレータをit++返しますが、インクリメント前のイテレータのコピーを返します。私は可能な解決策もある部分にコメントしました:)

于 2008-12-17T02:38:07.763 に答える
0
于 2009-01-08T00:43:34.377 に答える