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())。您不能将 from 转换boost::function<S>为指向具有签名的函数的指针S。如果它在您的控制范围内,您可以将回调设置器更改为采用boost::function<>而不是自由函数。如果这超出了您的控制范围,则您不能将非静态成员函数用于回调。

于 2013-10-30T02:07:07.410 回答