0

メンバー関数をコールバックとして API メソッドに割り当てようとしていますが、以下のエラー メッセージが返されます。これを解決する方法がわかりません。

cannot convert ‘boost::function<int(rcv_t_stct*, msg_t_stct*)>*’ to ‘rcv_cb {aka int (*)(rcv_t_stct*, msg_t_stct*)}’

コールバック署名:

typedef int (*rcv_cb)(rcv_t *rcv, msg_t *msg);

コールバック セッター:

create(rcv_cb cb);

私のメンバー関数:

int receiver::on_received(rcv_t *rcv, msg_t *msg)
{
    return 0;
}

セッターに割り当てようとしました:

boost::function<int (rcv_t *, msg_t *)> f2( boost::bind( &receiver::on_received, this, _1, _2) ); 
create(f2);

解決:

レシーバー クラスをシングルトンに変更し、静的メンバー関数を使用して非静的メンバー関数をラップしました。

int receiver::on_received(rcv_t *rcv, msg_t *msg)
{
    return receiver::instance().on_received_private(rcv, msg);
}

これは、この問題を解決するための最善の解決策ですか?

4

1 に答える 1

0

Aboost::function<>はフリー関数ではなく、ファンクタ ( を実装する型operator()) です。boost::function<S>からシグネチャを持つ関数へのポインターに変換することはできませんS。コントロール内にある場合は、コールバック セッターを変更してboost::function<>、自由な関数ではなく関数を取ることができます。それが制御できない場合、コールバックに非静的メンバー関数を使用することはできません。

于 2013-10-30T02:07:07.410 に答える