Fehlermeldung bei <algorithm> sort
-
Ich möchte einen Vector aus Studentenobjekten (bzw. aus Pointern auf Studentenobjekten) nach der zueletzt erreichten Note sortieren. Aus Übungszwecken wollte ich das mit der Funktion sort aus der <algortihm> machen.
Hab dazu folgende Funktionen erstellt.
bool OBS::compareLastNote(Student* stud1, Student* stud2) { if (stud1->getLastNote() < stud2->getLastNote()) { return true; } else return false; } void OBS::sortieren() { std::sort (allStudents_.begin(),allStudents_.end(),compareLastNote); }In der OBS.h ist der vector wie folgt deklariert:
std::vector <Student*> allStudents_;Nun bekomme ich aber folgende Fehlermeldung:
OBS.cpp:83:71: error: argument of type ‘bool (OBS::)(Student*, Student*)’ does not match ‘bool (OBS::)(Student, Student*)’
Die verstehe ich nicht, wäre super wenn mmir da jemand helfen könnte.
Schon mal Danke
-
Leg die Vergleichsfunktion als freie Funktion an. Im Moment ist sie eine Member-Funktion, das geht nicht so ohne weiteres, weil Zeiger auf Funktionen was anderes sind als Zeiger auf Member-Funktionen.
btw.
if(a<b) return true; else return false;lässt sich kürzer schreiben als
return a<b;
-
Ist compareLastNote eine statische Elementfunktion? Wenn nein: Warum nicht?
Das Ding ist, dass du eine nicht-statische Elementfunktion ja nur auf einem bestimmten Objekt aufrufen kannst. Und woher soll std::sort das nehmen? Die Aufrufsyntax über einen Methoden-Zeiger ist auch eine andere:
(einObjekt.*MethodenZeiger)(parameter1,parameter2);oder
(objektZeiger->*MethodenZeiger)(parameter1,parameter2);std::sort will etwas, was man so aufrufen kann:
etwas(parameter1,parameter2)und das kann dann ein "normaler" Funktionzeiger sein, oder ein Funktionsobjekt mit überladenden Funktionsaufrufoperator.
Wenn du noch das Denglisch durch Englisch ersetzen willst, würde ich "Grade" oder "Mark" statt "Note" schreiben.

-
Also wenn ich die Funktion aus der Klasse rausnehme also so.
bool compareLastNote(Student* stud1, Student* stud2) { return stud1->getLastNote()<stud2->getLastNote(); } class OBS { public: //Hier inhalt private: //hier auch };Bekomme ich folgende Fehlermeldung:**
build/Debug/Cygwin_4.x-Windows/OBS.o: In function
new\_allocator': /cygdrive/f/Eigene Dokumente/NetBeansProjects/Schmitt_Uebungsklausur/OBS.h:16: multiple definition ofcompareLastNote(Student*, Student*)'...**Aber ich habe m.E. nach keine mehrfachen defenitionen der Funktion.
-
verschiebe den Funktionsrumpf mal in die cpp, so dass in der Header nur noch die Deklaration steht.
-
Oder schreib inline davor...
-
Wenn ich die funtkion static mache funzt es, danke.
-
green_banana schrieb:
Wenn ich die funtkion static mache funzt es, danke.
Weißt du denn auch warum?!
Tipps:
- Siehe "one definition rule" (ODR)
- Auch wenn du etwas in nur einer einzigen Datei definierst, kannst du trotzdem die ODR verletzen, wenn du so eine Definition per #include in mehrere Übersetzungseinheiten reinpackst. #include macht ja nur copy-&-paste von Text!
- Funktionen, die innerhalb von Klassen/Struct-Definitionen definiert werden, sind automatisch inline. Und für inline-Funktionen gibt's Sonderregeln bei der ODR.
-
Bin gerade noch dabie das richtig zu verstehen.
Danke für den Hinweis werde mir das jetzt mal anschauen.