0

您好,我是一名学生,正在开发一个使用成员函数回调的程序。我遇到了 bind 的使用,这正是我所需要的。我只是很难让它工作。

下面是相关代码和编译错误

 // 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));函数指针声明为参数。

但是,问题是您试图传递 a 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 回答