2009-06-02 10 views
3

Ich versuche, einen Funktionszeiger zu verwenden, aber die drei folgenden Zeilen nur scheinen nicht zusammenarbeiten zu wollen ...Funktionszeiger Problem

Ich erhalte Fehlercode C3867.

Können Sie sehen, was ich falsch mache?

In .h-Datei

void MyFunc(int, FILEINFO*(*)(FILEINFO*), FILEINFO*, int); 

Die Definition in der CPP-Datei

void MyFunc(int number, FILEINFO*(*GetFiles)(FILEINFO*), FILEINFO* args, int type); 

hier Dann ist, wo ich eigentlich bin die Funktion

MyFuncClass->MyFunc(GetNumber(), &BigClass::PassThis, GetArgs(), TheType); 

Alle Probleme springen Aufruf aus?

+2

BigClass :: PassThis ist eine statische Funktion, richtig? –

+0

Erstes Ergebnis beim googlen Ihres Fehlercodes: http://msdn.microsoft.com/en-us/library/b0x1aatf(VS.80).aspx Scheint sehr klar xD – fortran

Antwort

7

Sie können eine nicht statische Elementfunktion einer Klasse nicht als normalen Funktionszeiger übergeben, da eine Elementfunktion implizit den This-Zeiger verwendet. Eine Lösung für dieses Problem besteht darin, eine statische Memberfunktion zu definieren, die einen Zeiger auf die Klasse als erstes Argument verwendet und den Aufruf an BigClass::PassThis umschließt und stattdessen einen Zeiger an diese Memberfunktion übergibt. Weitere Informationen finden Sie unter The Function Pointer Tutorials.

Eine bessere Lösung könnte die Verwendung von Funktoren sein.

+0

Ihre Lösung hat gut funktioniert. Vielen Dank! – samoz

+0

Schauen Sie auch in boost :: function, boost :: bind nach anderen Lösungen für dasselbe Problem. –

9

Was ist die Definition von BigClass::PassThis()? Ist es eine statische Klassenmemberfunktion oder eine reguläre Memberfunktion? Wenn es sich um eine reguläre Elementfunktion handelt, können Sie dies nicht tun, da sie einen versteckten this Parameter enthält. Siehe question 33.4 der C++ FAQ Lite.

2

Wir müssten die Definition von BigClass sehen. Wenn PassThis eine statische Elementfunktion ist, kann das, was Sie getan haben, nicht funktionieren, da normale Elementfunktionen nicht als Funktionszeiger übergeben werden können, wie Sie es tun (unter anderem haben Sie keinen 'diesen' Parameter)).

2

Ich vermute, dass &BigClass::PassThis ist ein Zeiger auf eine Member-Funktion und kein Zeiger auf eine gewöhnliche Funktion.

+0

Es ist erwähnenswert für diejenigen, die zu Hause folgen Es ist nicht so wichtig, welcher Typ 'BigClass :: PassThis' ist, solange das Ergebnis der Anwendung des '&' -Operators darauf einen Zeiger auf die entsprechend typisierte Funktion liefert. –