[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
-
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.