Funktionszeiger für Template klasse
-
Hi ich bin neu hier und hoffe auf eine gute Community^^
nun ja ich
Ich habe eine Templateklasse liste
und diese klasse besitzt eine Methode finden()nun möchte ich ein funktions zeiger als parameter übergebe.
Die funktion für den funktionszeiger soll dann z.b eine bedingung beinhalten wonach gesucht wird(nur zur vollständigkeit, ich bin am proggen eines ADS Baums)
so ist das ganze aufgebauttemplate<class typ1, class typ2> bool finde(bool (*fz)(typ1, typ2), typ2 name, T erg) //T ist der Haupttyp der klasse { //schleife zum durchlaufen der Liste if (fz(temp->info, name)) //temp ist ein zeiger auf ein struct { erg = temp->info; return true; } return false; }Nun möchte ich das ganze in meiner Baumklasse aufrufen
bool Baum::Entf(int name, int &erg) { //da ich noch nicht soweit bin mit dem durchsuchen des baumes nehm ich die wuzel Baum_S* Pos; if(wurzel->verzw.finde(delegate, int 5, Pos) { //...//} } bool Baum::delegate(Baum_S *verzw, int name) { //Baum_S ist ein struct // kap ist der name des zweiges / ast wie auch immer if (verzw->kap == name) return true; return false; }problem ist das er mir den fehler
"keine Übereinstimmung für ListeBaum::Baum_S*::Finde(Void) gefunden"
Stelle: if(wurzel->verzw.Finde(delegate)
ausgibt!
wo ist mein fehler ^^sorry für den unvollständigen code aber sonst wirds zuviel ^^
PS: Auserhalb einer Klasse funktioniert das ganze!
-
hallo
mal davon abgesehen das du die methode Finde und nicht finde aufrufst, stimmen auch die parameter nicht. die funktion fordert 3 parameter von dir, du uebergibst aber nur einen.
was ist von fz(dein funktionspointer) der return typ ?Meep Meep
-
ja sry hab ein paar parameter fergessen aber trotz alle dem ändert das nichts an der fehlermeldung!
ps habs oben editiert
mfg Spy
-
Vielleicht solltest du dir die STL mal genauer ansehen und gucken, wie das Suchen über Prädikate gelöst wird. Finde ich deutlich schöner als Zeiger auf Funktionen, und ausserdem erlaubt es dem Compiler, besser zu optimieren und schnelleren Code zu erzeugen.
PS:
Ohne Iterator Konzept würde ich als Suchergebnis einen Zeiger auf den Treffer zurückgeben und im Falle einer erfolglosen Suche 0. Spart jedenfalls den Referenzparameter erg, den man vor einem find Aufruf lokal deklarieren muss, was ich unschön finde.
-
Spy-Shifty schrieb:
ja sry hab ein paar parameter fergessen aber trotz alle dem ändert das nichts an der fehlermeldung!
Doch ändert es bestimmt.
"keine Übereinstimmung für ListeBaum::Baum_S*::Finde(Void) gefunden"
heißt es nur, wenn du noch irgendwo
Findegroß geschrieben hast und keine argumente übergibst. Schreib hier genau den Code rein der einen Fehler produziert. Und dann genau die Fehlermeldung dazu.Und DocShoe hat es ja schon angedeutet, dass dein finde template viel einfacher so geschrieben werden kann:
template<typename Pred, typename typ2> bool finde(Pred f, typ2 name, T& erg) //T ist der Haupttyp der klasse { if (f(temp->info, name)) { erg = temp->info; return true; } return false; }Ich nehm mal an, dass Du den gefundenen Wert in
ergspeichern möchtest oder so. Dann solltest du das auch als Referenz übergeben (T&).
-
danke für die Antworten!
ich werd das mal ausprobierenmfg Spy