2013-10-30 81 views
0

我想把一个成员函数作为回调函数分配给一个API方法,但是它返回下面的错误信息,我不知道如何解决这个问题。用boost :: bind和boost :: function赋值回调成员函数

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); 
} 

这是解决此问题的最佳解决方案吗?

+0

你可以改变回调签名'boost :: function '? –

+0

不,我不能。它是第三方库 –

回答

0

A boost::function<>不是一个免费函数,而是一个仿函数(类型实现operator())。您不能从boost::function<S>转换为指向具有签名S的函数的指针。如果它在您的控制范围内,您可以更改回调设置器,使其取代boost::function<>而不是免费功能。如果这不在你的控制之内,那么你不能使用非静态成员函数来进行回调。

+0

所以我必须在我的类中创建一个静态成员函数? –

+0

@BryanFok:或者一个免费函数,但是你不能使用非静态成员函数。 –

相关问题