関数ポインターをコールバックとして渡す必要がある API を使用しています。C++ のクラスからこの API を使用しようとしていますが、コンパイル エラーが発生します。
API 定義は次のとおりです。
typedef void (__stdcall *STREAM_CALLBACK)(void *userdata);
__declspec(dllimport) int __stdcall set_stream_callback(
STREAM_CALLBACK streamCB, void *userdata);
サードパーティが提供するファイルの例は次のとおりです。
void __stdcall streamCB(void *userdata)
{
// callback implementation
}
int main(int argc, const char argv[])
{
int mid = 0;
set_stream_callback(streamCB, &mid);
}
そして、それはうまくいきます。ただし、クラスでそれを使用しようとすると、エラーが発生します。
エラー C3867: 'MyClass::streamCB': 関数呼び出しに引数リストがありません。「&MyClass::streamCB」を使用して、メンバーへのポインターを作成します
使用する提案
&MyClass::streamCB
動作しません。set_stream_callback は非メンバー関数のみを受け入れることを理解しました。
この問題は、クラス メンバー関数をコールバックとして渡すにはどうすればよいですか?とよく似て います。 その中でヨハネスは簡潔な提案をしているが、私はそれをよく理解していない. この質問に関連していると私が正しければ、誰かが少し拡張できますか?
私が試してみました:
void __stdcall MyClass::streamCB(void *userdata)
{
// callback implementation
}
static void MyClass::Callback( void * other_arg, void * this_pointer ) {
MyClass * self = static_cast<ri::IsiDevice*>(this_pointer);
self->streamCB( other_arg );
}
//and in the constructor
int mid = 0;
set_stream_callback(&MyClass::Callback, &mid);
しかし
エラー C2664: 'set_stream_callback': パラメーター 1 を 'void (__cdecl *)(void *,void *)' から 'STREAM_CALLBACK' に変換できません
どうすればこれを回避できますか?
userdata
Edit1:また、コールバック内で使用したいstreamCB
。