我正在尝试将成员函数指定为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;
}
尝试分配给setter:
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);
}
这是解决此问题的最佳解决方案吗?
答案 0 :(得分:0)
boost::function<>
不是自由函数,而是函子(实现operator()
的类型)。您无法从boost::function<S>
转换为指向签名为S
的函数的指针。如果它在您的控制范围内,您可以将回调设置器更改为boost::function<>
而不是自由函数。如果这不在你的控制范围内,那么你就不能使用非静态成员函数来进行回调。