Operator !=



  • Ich hab bis jetzt Java programmiert, seit kurzem schau ich mir C++ an. Beim compilieren eines Tutorials hab ich folgenden Fehler bekommen:

    c:\workspaces\visualc++\game_ai_by_example\buckland_chapter3-steering behaviors\path.h(54) : error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'const std::list<_Ty>::_Iterator<_Secure_validation>' (or there is no acceptable conversion)
    with
    [
    _Ty=Vector2D,
    _Secure_validation=true
    ]
    d:\programme\microsoft platform sdk for windows server 2003 r2\include\guiddef.h(197): could be 'int operator !=(const GUID &,const GUID &)'
    d:\programme\microsoft visual studio 9.0\vc\include\list(301): or 'bool std::list<_Ty>::_Const_iterator<_Secure_validation>::operator !=(const std::list<_Ty>::_Const_iterator<_Secure_validation> &) const'
    with
    [
    _Ty=Vector2D,
    _Secure_validation=true
    ]
    while trying to match the argument list '(const std::list<_Ty>::_Iterator<_Secure_validation>, int)'
    with
    [
    _Ty=Vector2D,
    _Secure_validation=true
    ]

    der Fehler tritt an dieser Stelle im Code auf:

    Vector2D    CurrentWaypoint()const{assert(curWaypoint != NULL); return *curWaypoint;}
    

    dabei ist noch zu erwähnen das curWaypoint vom Typ

    std::list<Vector2D>::iterator  curWaypoint;
    

    ist.

    nun würde ich gerne wissen, wieso diese Codezeile einen Fehler gibt. Da mir nicht klar ist, wie ich die Variable sonst auf einen Nullpointer überprüfen soll.



  • Da es kein Zeiger ist kannst du es auch nicht auf einen Null-Zeiger testen.
    Ein Iterator ist eben ein Iterator.
    In C++ gibt es keine allgemeine Möglichkeit einen Iterator auf Gültigkeit zu prüfen.
    Wenn du etwas brauchst was explizit "NULL" gesetzt werden kann, und wenn es nicht NULL ist einen Iterator halten, dann nimm boost::optional<std::list<Vector2D>::iterator>.

    Und wenn es dir nur auf das "assert" ankommt, dann schmeiss das assert() einfach raus, und verwende eine STL Implementierung mit "iterator debugging". Die vom MSVC 2005 kann das z.B.
    Die Iteratoren checken dann automatisch intern ob sie gültig sind, bei jedem Zugriff. Macht allerdings auch nur zu Debugging-Zwecken Sinn, man sollte NIE Code schreiben der sich darauf verlässt. (Unabhängig davon ob man die Checks dann im Release-Mode drinnen lässt oder nicht)


Anmelden zum Antworten