std::list<T>::iterator operator "<" und VisualC++



  • Hallo,

    ich habe ein Problem unter Visual C++ (MS Visual Studio 8), was den Vergleich zweier std::list Iteratoren mit dem Operator < angeht und ich steige nicht dahinter...

    ...
    std::list<T>::iterator myList;
    std::list<T>::const_iterator myListEnd;
    ...
    if( myList < (--myListEnd) )
    {
        // etwas machen...
    }
    ...
    

    Hier bekomme ich unter anderem folgende Fehlermeldung:

    error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "std::list<_Ty>::_Const_iterator<_Secure_validation>" hergeleitet werden.

    error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "std::list<_Ty>::_Const_iterator<_Secure_validation>" hergeleitet werden.

    Der Operator == funktioniert übrigens mit dem gleichen Aufruf. Unter Borland hat sowohl == als auch < funktioniert.

    Hat jemand eine Idee von Euch?

    Vielen Dank schon mal.

    Grüßle,
    Matthias



  • Was möchtest Du denn machen (z.B. über die Liste iterieren bis zum vorletzten Item oder so...)??

    Ansonsten würde ich sagen <, >, <= und >= sind nicht für Iteratoren.

    Simon



  • Hallo,

    ich möchte sicherstellen, dass ich noch nicht am Ende der Liste bin. Wundert mich halt, dass es in Borland so ging 😞
    Finde die Abfrage sicherer, als immer direkt auf das letzte Element zu prüfen.

    Grüßle,
    Matthias



  • Unter Umständen weiss ein bidirektionaler Iterator nur um das vorherige und nächste Element, nicht aber in welcher Beziehung sein Element zu einer beliebigen Position steht. Deshalb müssen solche Iteratoren nur == und != implementieren. Ob eine Implementierung auch andere Operatoren anbietet, ist ihr freigestellt, auch, wie diese intern arbeiten.



  • Hallo

    So kann über die Liste iteriert werden.

    std::list<int> list;
    std::list<int>::const_iterator it = list.begin();
    std::list<int>::const_iterator end = list.end();
    for(;it != end; ++it)
    {
       int i = *it;
    }
    

    Ich hoffe, ich habe nicht daneben geschossen. 🙂

    Gruss Simon



  • Könnte sein. Hab die Liste jetzt durch einen std::vector<T> ersetzt und jetzt funktionieren auch die <> Operatoren.

    Danke 🙂

    Grüßle,
    Matthias



  • Auch mit std::vector sollte != benützt werden.
    Die Auswahl des am besten geeignetsten Containers darf nicht von < oder > abhängen. Jeder Container hat andere Vor- und Nachteile.


Anmelden zum Antworten