equal_to<T>
-
Hallo zusammen!
Mein Compiler gibt mir bei der Arbeit mit dem Funktionsobjekt 'equal_to<T>' eine Fehlermeldung zurück, die ich zwar verstehe, aber von der ich ehrlich gesagt nicht weiss, wie man das angeblich auftretende Problem lösen könnte!
Der Code sieht, natürlich stark vereinfacht, in etwa so aus:
class TMyClass { public: TMyClass(){} ~TMyClass(){} bool operator==(const TMyClass& obj) { return(<Vergleich>); } }; int main(int argc, char* argv[]) { equal_to<TMyClass> e; cout<<e(TMyClass(),TMyClass())<<endl; char c; cin>>c; return 0; }
Der Aufruf des Funktionsobjekts 'equal_to<T>' per Operator, führt ja zwangsläufig zu einem Vergleich der beiden 'TMyClass'-Objekte per '=='-Operator. Mein Compiler behauptet allerdings steif und fest, dass der Vergleichsoperator für Instanzen des gleichen Typs nicht implementiert wäre!
Rufe ich allerdings zu Testzwecken den Vergleichsoperator in Verbindung mit zwei 'TMyClass'-Instanzen manuell auf, ergeben sich keinerlei Schwierigkeiten. Dann ist der Compiler plötzlich davon überzeugt, dass der '=='-Operator tatsächlich implementiert wurde!
Ich kann mit diesem doch etwas merkwürdigen Verhalten nicht sonderlich viel anfangen!
Kann mir vielleicht jemand helfen? Seit Ihr auch schon einmal auf dieses Problem gestossen?
Danke!
Grüße,
TS++
-
versuch mal den operator als friend zu definieren.
Devil
-
lass das T vor dem Klassennamen weg und schau dir mal was zum thema 'const-correctness' an. Bzw. mach es wie devil gesagt hat, nur bitte ohne friend.
btw: op== als member zu haben ist recht unschoen.
-
@devil81:
Hab's ausprobiert! Funktioniert leider nicht. Trotzdem danke!@Shade Of Mine:
Ok, ich google etwas!
Was das T anbelangt: reine Gewohnheit. Microschuft-Programmierer setzen traditionell ein 'C' vor den Klassennamen, ich eben ein T.Grüße,
TS++
-
TS++ schrieb:
Hab's ausprobiert! Funktioniert leider nicht. Trotzdem danke!
funktioniert sehr wohl. zeig mal den source der nicht geht + fehlermeldung
-
OK, der Code:
class TMyClass { public: TMyClass(){} ~TMyClass(){} bool operator==(const TMyClass& obj) { return(true); } friend class equal_to<TMyClass>; }; int main(int argc, char* argv[]) { equal_to<TMyClass> e; cout<<e(TMyClass(),TMyClass())<<endl; return 0; }
Und die Fehlermeldung:
[C++ Fehler] _function_base.h[55]:
E2093 'operator==' ist im Typ 'TMyClass' für Argumente des gleichen Typs nicht implementiert!In Zeile 55 der Datei _function_base.h kommt es zum Aufruf des Vergleichsoperators:
52 template <class _Tp> 53 struct equal_to : public binary_function<_Tp,_Tp,bool> 54 { 55 bool operator()(const _Tp& __x, const _Tp& __y) const {return __x==__y;} 56 };
-
nur aus interesse: welchen compiler verwendest du?
so nun zu deinem problem:
devil meinte, du sollst den operator== zu einer friend funktion machen
alternativ kannst du den opeartor== als methode drin lassen, musst sie dann aber als const deklarieren.ich wuerde zur variante C raten:
class MyClass { public: bool compare(MyClass const& other) const { return(true); } }; bool operator==(MyClass const& a, MyClass const& b) { return a.compare(b); } int main(int argc, char* argv[]) { equal_to<MyClass> e; cout<<e(MyClass(),MyClass())<<endl; return 0; }
compare koennte man auch static machen... das ist wohl geschmacksache.
-
@Shade Of Mine:
Meine IDE: der BCB6
Danke für den Tipp! Funktioniert!
Nur kann ich leider nicht so ganz folgen, warum der Vergleichsoperator als 'const' deklariert werden muss!Liegt es daran, dass in '_function_base.h' der '()'-Operator und die Referenzen ebenfalls mit 'const' angesetzt werden?
Grüße,
TS++
-
der operator() von equal_to so deklariert
bool operator()(T const& a, T const& b);
ein const also.
wenn du nun einen nicht const methode aufrufen willst, kann das nicht gehen. denn eine nicht const methode darf das objekt aendern. T const& heisst aber, dass operator() die objekte nicht aendern _darf_.
das ist die grundlage von const-correctness. sihe dazu auch bens.c-plusplus.info
weiters sind muessen temporaere objekte als const-referenz an funktionen uebergeben werden - nicht conts-referenzen sind verboten.
-
@Shade Of Mine:
Danke für die Antwort!Noch ein schönes Wochenende!
Grüße,
TS++