コールバックとして扱われるlibeventにメンバー関数を渡そうとしています。libeventを使用したメンバー関数へのコールバック
#include <event.h>
class A
{
public:
void eventcb(evutil_socket_t fd, short events, void *ctx) { }
};
static void global_eventcb(evutil_socket_t fd, short events, void *ctx) { }
typedef void (A::*mthd)(evutil_socket_t, short, void*);
int main(void)
{
struct event_base *evbase = event_base_new();
mthd eventcb = &A::eventcb;
A *instance = new A;
(instance->*eventcb)(NULL, 0, NULL);
struct event *timer1 = evtimer_new(evbase, global_eventcb, NULL);
struct event *timer2 = evtimer_new(evbase, (instance->*eventcb), NULL);
return 0;
}
私は正常クラスAにおけるeventcbにメソッドポインタを作成し(行20)のインスタンスでそれを呼び出すことができます。
また、22行目のグローバル関数(Cと同じように)を渡すとうまく動作します。
しかし、私は何をしています
example.cpp:23:25: error: no matching function for call to 'event_new'
struct event *timer2 = evtimer_new(evbase, (instance->*eventcb), NULL);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from example.cpp:1:
In file included from /usr/local/include/event.h:71:
/usr/local/include/event2/event.h:749:40: note: instantiated from:
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
^~~~~~~~~
/usr/local/include/event2/event.h:833:15: note: candidate function not viable: no know conversion from '<bound member function type>' to 'event_callback_fn'
(aka 'void (*)(int, short, void *)') for 4th argument
struct event *event_new(struct event_base *, evutil_socket_t, short, event_callback_fn, void *);
^
1 error generated.
、行23で、私はlibeventに私のメソッドポインタを渡そうとすると、私はこれをコンパイルするとき、私は(打ち鳴らすコンパイラを使用して)、次のエラーを取得します間違っている?
[create_pthread()呼び出しのキャストメンバ関数]の複製が可能です。(http://stackoverflow.com/questions/6826620/cast-member-function-for-create-pthread-call) – Mat
「正確な重複"答えはまったく同じです。それを直接行うことはできません。メンバ関数へのポインタは、通常のポインタへのポインタと互換性がありません。あなたはそれを動作させるためにいくつかのグルーコードが必要です。 – Mat
Allright、私は私の現在の解決策に固執しなければならないと思います。コールバック(グローバル)にAのインスタンスを渡してから、(A *)ctx) - > eventcb (...)。 あなたの返信ありがとう –