std::sort kennt meinen operator< nicht
-
hola
hab in meiner directory-klasse einen vector<file_data>.
die klasse file_data beinhaltet den operator<.[C++ Fehler] _function_base.h(73): E2093 'operator<' ist im Typ 'file_data' für Argumente desselben Typs nicht implementiert
das ist dann die fehlermeldung.
template <class _Tp> struct less : public binary_function<_Tp,_Tp,bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }//1 };
das is die zeile in der fehlermeldung
bool operator<(const file_data &fd) { return filename.compare(fd.filename) < 0 ? true : false; }
das habe ich in public bereich meiner file_data klasse stehen.
erlich gesagt versteh ich die fehlermeldung inhaltlich nicht ganz.
bitte um hilfe
cermy
Meep Meep
-
Hallo,
wenn du den Operator< unbedingt als Memberfunktion implementieren willst, dann muss diese Memberfunktion const sein:bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }
Außerdem solltest du daran denken, dass ein Vergleich bereits einen Wert hat. Den explizites true : false ist völlig unnötig.
bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }
-
re
HumeSikkins schrieb:
Hallo,
wenn du den Operator< unbedingt als Memberfunktion implementieren willst, dann muss diese Memberfunktion const sein:bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }
Außerdem solltest du daran denken, dass ein Vergleich bereits einen Wert hat. Den explizites true : false ist völlig unnötig.
bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }
warum muss ich den operator< const machen ? macht das einen sinn ?
warum ist explizites true : false unnoetig ?
compare gibt bei kleiner -1, bei gleich 0 und bei groesser 1 zurueck.
compare wuerde also nur bei == false zurueckgeben, bei < || > wuerde er true geben. oder seh ich das falsch ?Meep Meep
-
Meep Meep schrieb:
warum muss ich den operator< const machen ? macht das einen sinn ?
Natürlich macht das einen Sinn. Schau dir doch mal die Definition von std::less an, die dir dein Compiler ja freundlicherweise bereits ausgespukt hat:
template <class _Tp> struct less : public binary_function<_Tp,_Tp,bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }//1 };
Wenn du den Operator< als Member implementiert hast, dann bedeutet
return __x < __y;
ja nix anderes als:
return __x.operator <( __y);
Nun schau dir die Deklaration von __x in diesem Kontext an:
bool operator()(const _Tp& __x, const _Tp& __y) const
__x ist eine Referenz auf ein *konstantes* Objekt, d.h. über diese Referenz kannst du, im Sinne der const-correctness, demzufolge natürlich auch nur const-Memberfunktionen aufrufen. Ergo muss deine Implementation des operator< eine const-Memberfunktion sein.
warum ist explizites true : false unnoetig ?
Diese Frage solltest du dir, wenneigentlich selbst beantworten können.
Der Operator? hat doch die Form:boole'sche-Bedingung ? true-Fall : false-Fall;
Also ist:
return filename.compare(fd.filename) < 0 ? true : false;
äquivalent zu:
return (filename.compare(fd.filename) < 0) == true ? true : false;
und das ist, wie du hoffentlich siehst, äquivalent zu
return filename.compare(fd.filename) < 0;
-
du musst ihn const machen, damit er auch für konstante Objekte aufgerufen werden kann, nehme ich an.
bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0 ? true : false; }
ist das selbe wie
bool operator<(const file_data &fd) const { return filename.compare(fd.filename) < 0; }
Der Grund ist einfach, das der Vergleich ( < 0 ) schon einen boolschen Wert zurueckliefert. Dieser ist true, wenn es eben kleiner Null ist. Du unterstuetzt das nochmal und sagst, dass er true zurueckliefern soll, wenn der Vergleich true liefert
Hoffe das ist verstaendlich.
Allerdings ist es nicht zu verwechseln mitbool operator<(const file_data &fd) const { return filename.compare(fd.filename); }
Denn hier wird true geliefert, wenn das Ergebnis von Compare undgleich Null ist.
Gruss,
DeSoVoDaMu
-
re
danke fuer die erklaerung . jetz hab ichs kapiert
Meep Meep