Override List.Sort macht Probleme
-
Hi,
Ich hab da n kleines Problem mit dem Überschreiben der List.sort methode
Ich habe eine List vom Typ CPerson (Eine Klasse wo nur vor und nachnamen gespeichert sind)
Beim googeln hab ich gesehen dass die Leute das ungefähr so machen:bool compare(const CPerson *first,const CPerson *second) { return false; } int main { list<CPerson> mylist; //Hier werden dann Personen geadded mylist.sort(compare) }Aber wenn ich das so Probiere kommt bei mir folgender Fehler:
error no matching function for call to std::list<CPerson, std::allocator<CPerson> ....Kann mir da jemand weiterhelfen?
Ich kann falls nötig natürlich alle klassen hochladen.
Danke und Gruß,
zottelhase
-
Warum schneidest du einfach die Fehlermeldung ab? Wenn dir geholfen werden soll, bitte auch wirklich die ganze Meldung posten.
) CPerson ist nicht kompatibel mit CPerson - das sind zwei verschiedene Typen. Daher wird wohl wahrscheinlich auch der Fehler rühren...
Hier ein Link zur Doku:
http://www.cplusplus.com/reference/stl/list/sort/
-
Danke für die antwort, die neue Methode sieht jetzt so aus:
bool compare(const CPerson first,const CPerson second) { return false; }Fehlermeldung jetzt ist:
error: no matching function for call to ‘std::list<CPerson, std::allocator<CPerson> >::sort(<unresolved overloaded function type>)’ include/c++/4.4.1/bits/list.tcc:301: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = CPerson, _Alloc = std::allocator<CPerson>] include/c++/4.4.1/bits/list.tcc:301: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = CPerson, _Alloc = std::allocator<CPerson>]Ich versteh halt nicht ganz was bei mir der genaue Unteschied zu
dem Beispiel http://www.cplusplus.com/reference/stl/list/sort/ ist. Ausser dass ich ne eigene Klasse CPerson verwende.
Gruß,
Zottelhase
-
Kannst du mal ein Minimalbespiel erstellen, wenn dein Originalcode zu lange (>100 Zeilen) ist? Man kann sonst nur raten. Denn irgendwo musst du was falsch machen, ist mir noch nie untergekommen, dass sort nicht klappt, wenn man alles richtig macht

-
prinzipiell sollte dein Vorgehen funktionieren, auch wenn ich eher mit const-Referenzen arbeiten würde (beid er compare-Funktion),
also
bool compare(const CPerson& first,const CPerson& second)so müssen für den vergleich keine kompletten Kopien angelegt werden.
als workaround könntest du std::sort aus <algorithm> verwenden:
std::list<CPerson> persons; std::sort(persons.begin(), persons.end(), compare);andere Option wäre, für CPerson den operator < zu überladen, da std::list::sort den standardmäßig verwendet.
-
Zottelhase schrieb:
error: no matching function for call to ‘std::list<CPerson, std::allocator<CPerson> >::sort(<unresolved overloaded function type>)’Es gibt anscheinend mehr als eine compare-Funktion sichtbar. Der Compiler weiß aber nicht, welche Du meintest. Quickfix: Umbenennen oder ein static_cast:
int foo(int); double foo(double); template<class T> void sink(T); int main() { sink(foo); // Fehler! Welches foo? sink(static_cast<int(*)(int)>(foo)); // OK int (*funptr)(int) = foo; // OK sink(funptr); // OK }