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

我很困惑,因为我相信我给了它正确的迭代器。

我的是 SpaceObject 的子类(第二代子类)

这有什么关系吗?我将如何解决它?

4

3 回答 3

4

问题是您正试图将地雷的迭代器用作 onScreen 列表中的迭代器。这行不通。

你的意思是调用 mines.erase(iterMines) 而不是 onScreen.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--;
        }
}

一个真正的问题,一个可能的解决方案:

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 回答