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 aufgebaut

    template<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 Finde groß 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 erg speichern möchtest oder so. Dann solltest du das auch als Referenz übergeben ( T& ).



  • danke für die Antworten!
    ich werd das mal ausprobieren

    mfg Spy


Anmelden zum Antworten