0

こんにちは私はメンバー関数のコールバックを使用するプログラムに取り組んでいる学生です。私はまさに私が必要としているものであるバインドの使用に出くわしました。私はそれを機能させるのに苦労しています。

以下は、関連するコードとコンパイルエラーです

 // this is the API function to register callback
 void register_callback_datapoint(void(*)(datapoint_t *datapoint) cb_datapoint ) 

 // this function is my callback
 void datapoint_update(datapoint_t* datapoint);

 // this code is called in the aggregateThread class
 boost::function<void(datapoint_t*)> f;
 f = bind(&aggregateThread::datapoint_update, this, std::tr1::placeholders::_1);
 register_callback_datapoint(f);

 // here is the compile error
 cannot convert ‘boost::function<void(datapoint_opaque_t*)>’ to ‘void (*)(datapoint_t*)
 {aka void (*)(datapoint_opaque_t*)}’ for argument ‘1’ to ‘void 
 register_callback_datapoint(void (*)(datapoint_t*))’

誰かがこれを手伝ってくれませんか?ありがとうございました

4

1 に答える 1

0

まず、 でエラーが発生しなかったことに驚いていますvoid register_callback_datapoint(void(*)(datapoint_t *datapoint) cb_datapoint )。適切な構文はvoid register_callback_datapoint(void(*cb_datapoint)(datapoint_t *datapoint));、関数ポインターをパラメーターとして宣言するためのものです。

boost::functionただし、問題は、関数オブジェクトであり、への関数ポインターに暗黙的に変換できないを渡そうとしていることregister_callback_datapointです。boost::functionパラメータを変更するか、テンプレートにする必要があります。

void register_callback_datapoint(boost::function<void(datapoint_opaque_t*)> f);

また

template <typename Func>
void register_callback_datapoint(Func f);

また、これに気付きましたが、あなたの例とコンパイルエラーが一致しません。一人が言いdatapoint_opaque_t*、もう一人はdatapoint_t*どちらが違う名前だと言います。それが問題になるかどうかはわかりません。

于 2012-11-28T21:40:47.977 に答える