Hilfe mit C++ Liste mit erase-Funktion
Ich versuche zu tun, ein einfaches löschen und bekomme immer Fehler.
Hier ist das code-snippet für meine löschen:
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--;
}
}
Bekomme ich immer eine compiler-Meldung:
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
Ich bin verwirrt, weil ich glaube, ich gebe es den richtigen iterator.
Mine ist eine Unterklasse von SpaceObject (eine zweite generation Unterklasse ist)
Hat das etwas zu tun mit es? Und wie kann ich es beheben?
- Nur um sicher zu gehen, ist die Zeile 158 "iterMines = auf dem Bildschirm.löschen(iterMines);"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie versuchen, verwenden Sie den iterator von Minen als iterator in der angezeigten Liste. Das wird nicht funktionieren.
Meinst du zu nennen Minen.löschen(iterMines), anstatt auf dem Bildschirm.löschen(iterMines)?
Ein echtes problem, und eine mögliche Lösung:
erase
wird Ihnen die nächste iterator nach dem entfernten element. Also, wenn Sie am Anfang, und löschen, Sie werden den neuen Anfang. Wenn Sie dann verringern Sie den iterator, Sie verringern vor beginnen. Und dieser ist ungültig. Besser Faktor aus deriterMines++
in den Körper der Schleife:Besser die pre-increment, da man nie weiß, was einen iterator hinter der Szene, wenn es erstellt eine Kopie von sich selbst.
++it
wird die Rückkehr der neuen iterator, währendit++
zurückkehren wird, eine Kopie der iterator vor dem increment. Ich habe, kommentierte der Teil, wo die mögliche Lösung zu 🙂mehr einfache Methode
Liste.erase(p)的用法