Welcher Vergleichsoperator einer Klasse wird gewählt wenn zwei existieren?
-
Braunstein schrieb:
Die Frage ist hier, wenn man z.Bsp. sort() auf einen std::vector<foo> anwendet, welcher Operator wird genommen?
Keiner. Imo sollte das einen Compilerfehler geben. Sicher dass das Problem deines Kollegen genau so aussah? Evtl. hatte ein operator eine leicht andere Parameterliste?
-
hustbaer schrieb:
In der Member-Version ist "lhs" (*this) nicht const.
Daher nicht ambiguous.Ach stimmt, übersehen...
-
Hallo,
Danke für die Antworten.
Ob die Memberversion const war weiß ich jetzt nicht genau. Ich werde mal nachfragen.
Das Problem hier war, dass es keinen Ambiguous Fehler gab. Allerdings haben sich verschiedene Compiler unterschiedlich verhalten. gcc unter Windows (MinGW) sowie VC10 wählten die freie Funktion gcc unter Linux die Membervariante. Die gccs können unterschiedliche Versionen sein, auch dass müsste ich erst nachfragen.
-
Braunstein schrieb:
Hallo,
Danke für die Antworten.
Ob die Memberversion const war weiß ich jetzt nicht genau. Ich werde mal nachfragen.
Das Problem hier war, dass es keinen Ambiguous Fehler gab. Allerdings haben sich verschiedene Compiler unterschiedlich verhalten. gcc unter Windows (MinGW) sowie VC10 wählten die freie Funktion gcc unter Linux die Membervariante. Die gccs können unterschiedliche Versionen sein, auch dass müsste ich erst nachfragen.Ne. Prinzipiell ist Code Logik pur, also können da nicht verschiedene Ergebnisse herauskommen. Ich vermute, ihr habt einfach verschiedene "Test-Codes" gehabt, mit Konstanten und Variablen Instanzen.
-
Hacker schrieb:
Braunstein schrieb:
Hallo,
Danke für die Antworten.
Ob die Memberversion const war weiß ich jetzt nicht genau. Ich werde mal nachfragen.
Das Problem hier war, dass es keinen Ambiguous Fehler gab. Allerdings haben sich verschiedene Compiler unterschiedlich verhalten. gcc unter Windows (MinGW) sowie VC10 wählten die freie Funktion gcc unter Linux die Membervariante. Die gccs können unterschiedliche Versionen sein, auch dass müsste ich erst nachfragen.Ne. Prinzipiell ist Code Logik pur, also können da nicht verschiedene Ergebnisse herauskommen. Ich vermute, ihr habt einfach verschiedene "Test-Codes" gehabt, mit Konstanten und Variablen Instanzen.
Dir ist vermutlich nicht klar, dass verschiedene Compiler auch verschiedene Bugs haben.
-
ps:
http://ideone.com/dL4Am
http://ideone.com/lDu0SWas ich nicht verstehe ist die Warning von GCC vor dem Error:
prog.cpp:23:20: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
prog.cpp:15:6: note: candidate 1: bool operator<(const foo&, const foo&)
prog.cpp:9:9: note: candidate 2: bool foo::operator<(const foo&) constDer "rhs" Parameter ist gleich, also kanns an dem nicht liegen. Er meint also den "lhs" Parameter. Also einmal zu "this" mit const, und einmal als "normale" Lvalue-Referenz-to-const. Warum ist da die Konvertierung mit der normalen Lvalue-Referenz-to-const besser?
-
Hacker schrieb:
Ne. Prinzipiell ist Code Logik pur, also können da nicht verschiedene Ergebnisse herauskommen. Ich vermute, ihr habt einfach verschiedene "Test-Codes" gehabt, mit Konstanten und Variablen Instanzen.
Du musst nicht ständig Deine i.d.R. falsche Meinung zum Besten geben.
Lies' einfach schweigend mit und warte noch ein paar Jahre.
-
So, die Membervariante war nicht const. Dann ist es auch klar, dass die ambiguous Warnung nicht kommen konnte.
Im Falle der Verwendung in std::sort wäre das ja dann auch keine Warnung, sondern ein Fehler gewesen (zumindest bei meinem MinGW).
Die gccs waren verschiedene Versionen (4.5.1 und 4.6.1).
-
Ambiguous ist doch immer ein Fehler? Warnings kenne ich da keine.
-
Mein gcc 4.5.2 gibt mit den Standardeinstellungen von CodeBlocks nur eine Warnung sofern ich nur einen einfachen Vergleich durchführe. Verwende ich sort gibt es einen Fehler.
Erst wenn ich -pedantic einschalte gibt es immer einen Fehler.PS: Das gilt nur wenn beide beteiligte Variablen nicht const sind. Wenn nur eine davon const ist gibt es auch einen Fehler.
-
Wenn es die gleiche Warning ist, die hustbaer vorhin schon gepostet hat, dann steht doch eh in der Warning schon, dass das nonstandard Behaviour ist!?
Zeig doch mal den genauen Code und die genaue Warning, sonst können wir nur raten...
-
Ok, wenn du willst.
D:\Programming\Test\CodeBlocks\Test\main.cpp||In function 'int main()':|
D:\Programming\Test\CodeBlocks\Test\main.cpp|27|warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:|
D:\Programming\Test\CodeBlocks\Test\main.cpp|17|note: candidate 1: bool operator<(const foo&, const foo&)|
D:\Programming\Test\CodeBlocks\Test\main.cpp|11|note: candidate 2: bool foo::operator<(const foo&) const|
||=== Build finished: 0 errors, 1 warnings (0 minutes, 1 seconds) ===|class foo { public: int i; int j; foo(int i_, int j_) : i(i_), j(j_) {} bool operator<(const foo& val) const { std::cout << "Member\n"; return i<val.i; } }; bool operator<(const foo& lhs, const foo& rhs) { std::cout << "Frei\n"; return lhs.j<rhs.j; } int main () { foo a(1,3); foo b(2,1); foo const c(2,1); std::cout << (b < a) << "\n"; }
-
Mit -pedantic werden beim GCC alle Extensions abgeschaltet, dann gibt es auch einen Fehler.
-
Hatte ich schon erwähnt.