[gelöst] template-abhängigen Funktionspointer übergeben geht nicht



  • Hallo,

    ich habe einen Konstruktor einer Template-Klasse der einen Funktionspointer übernhmen soll, der vom Template-Parameter abhängt. Das sieht so aus:

    template <typename T>
    class Foo
    {
    public:
        typedef void (*func)(T);
        Foo(T* ptr);
        Foo(func func_ptr);
    
    private:
        T* m_ptr;
        func m_func_ptr;
    };
    

    Wenn ich sie jetzt mit einer void(bool) Funktion instantiieren will, geht das nicht:

    void fun(bool b) { doSomethingWith(b); }
    // ...
    
    Foo* bar = new Foo<bool>(&fun);
    

    gibt mir in gcc 4.4:

    error: no matching function for call to ‘Foo<bool>::Foo(void* (*&)(bool))’
    note: candidates are: Foo<T>::Foo(void (*)(T)) [with T = bool] <near match>
    

    Was habe ich hier übersehen?

    Gruß,
    Phil


  • Administrator

    Dein Code sieht aber anders aus, als den du präsentiert hast. Dein Konstruktor sieht nämlich so aus:

    Foo(func& func_ptr);
    

    Nimm diese Referenz weg und übergibt den Zeiger als Kopie und alles funktioniert wie es soll. Wieso überhaupt als Referenz übergeben?

    Grüssli



  • Ausserdem:

    Foo<bool>* bar = new Foo<bool>(fun);
    


  • Hessisches Universalfragewort: Hä?

    Also ja, da ist noch eine Indirektionsebene dazwischen.
    Der konkrete Aufruf sieht so aus:

    void fun(bool b) { doSomethingWith(b); }
    
    requestData(&fun);
    

    wobei die requestData()-Funktion folgendes macht:

    requestData(void(*fun(bool)))
    {
        Foo<bool>* bar = new Foo<bool>(fun)));
        // ...
    }
    


  • Sorry, ich bin dämlich.

    Die Funktionssignatur muss natürlich

    requestData(void(*)(bool));
    
    requestData(void(*func)(bool)) {
        Foo<bool> bar = new Foo<bool>(func);
    }
    

    lauten.

    So geht's.


Anmelden zum Antworten