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.