2009-06-02 21 views
3

私は関数ポインタを使用しようとしていますが、ちょうど下の3行は協力したくていないようです...私はエラーコードC3867を取得しています関数ポインタの問題

私が間違っていることを見ることができますか?私は実際に

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

すべての問題がジャンプ関数を呼び出すよどこ.hファイル

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

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

そして、ここでの.cppファイル内の定義で

ですでる?

+2

BigClass :: PassThisは静的関数です。 –

+0

最初の結果、あなたのエラーコードをグーグルとき:http://msdn.microsoft.com/en-us/library/b0x1aatf(VS.80).aspx することは、自宅に沿って、次の人のためそれは注目に値します非常に明確xDさん – fortran

答えて

7

通常関数ポインタとして、クラスの非静的メンバー関数を渡すことはできません。これは、メンバ関数がこのポインタ を暗黙的に使用するためです。これに対する解決策は、最初の引数としてポインタ をクラスに持ち、呼び出しをBigClass::PassThisにラップし、代わりにそのメンバ関数へのポインタを渡す静的メンバ関数を定義することです。詳細については、 The Function Pointer Tutorialsを参照してください。

よりよい解決策は、代わりにファンクタを使用することです。

+0

あなたの解決策はうまくいきました。ありがとう! – samoz

+0

また、同じ問題の他の解決策のためにboost :: function、boost :: bindを見てください。 –

9

BigClass::PassThis()の定義は何ですか?それは静的クラスメンバ関数か正規メンバ関数ですか?それが隠されたthisパラメータを持っているので、それが通常のメンバ関数であれば、それを行うことはできません。 C++ FAQ Liteのquestion 33.4を参照してください。

2

BigClassの定義を見る必要があります。 PassThisが静的メンバ関数でない限り、通常のメンバ関数を関数ポインタとして渡すことができないため、これを行うことはできません(他のものの中では、 'this'パラメータがありません)。

2

私は、&BigClass::PassThisがメンバー関数へのポインタであり、通常の関数へのポインタではないと推測しています。

+0

ようです'BigClass :: PassThis'型は、'& '演算子を適用した結果、適切に型付けされた関数へのポインタを得ることができる限り重要ではありません。 –