使用成员函数进行Boost绑定会导致编译错误

时间:2014-07-24 08:44:07

标签: c++ c boost bind

我有这个有效的C程序:

// callback
void NewEIT(void *priv, dvbpsi_handle h_dvbpsi,
            uint8_t table_id, uint16_t extension) {
    // ...
}

void Decoder::open_file()
{
    dvbpsi_eit = dvbpsi_AttachDemux(NewEIT, NULL);
    // ...
}

我试图"转换"它在C ++中:

void Decoder::NewEIT(void *priv, dvbpsi_handle h_dvbpsi,
            uint8_t table_id, uint16_t extension) {
    // ...
}

void Decoder::open_file()
{
    dvbpsi_eit = dvbpsi_AttachDemux(boost::bind(&Decoder::NewEIT, this), NULL);
    // ...
}

我是boost :: bind的新手,所以我试着去做我在doc中发现的东西,这里是堆栈溢出,但是我无法摆脱这个错误:< strong>没有匹配函数来调用&#39; dvbpsi_AttachDemux 。

有人可以解释一下我在C ++代码中做错了什么吗?谢谢!

这里定义了dvbpsi_AttachDemux:

/*****************************************************************************
 * dvbpsi_AttachDemux
 *****************************************************************************/
/*!
 * \fn dvbpsi_handle_t dvbpsi_NewPSISection(dvbpsi_demux_new_cb_t pf_new_cb, void * p_new_cb_data)
 * \brief Creates a new demux structure.
 * \param pf_new_cb A callcack called when a new type of subtable is found.
 * \param p_new_cb_data Data given to the previous callback.
 * \return a handle to the new demux structure.
 */
__attribute__((deprecated))
dvbpsi_handle dvbpsi_AttachDemux(dvbpsi_demux_new_cb_t pf_new_cb,
                                 void *                p_new_cb_data);

1 个答案:

答案 0 :(得分:2)

这取决于dvbpsi_demux_new_cb_t pf_new_cb究竟是什么,但您的boost::bind来电并不是您认为的。

就像它会生成一个不带参数的function对象。如果您确实希望获得通过的四个参数,可能需要使用:

boost::bind(&Decoder::NewEIT, this, _1, _2, _3, _4)

我说您需要调整dvbpsi_demux_new_cb_t pf_new_cb以接受function<void(void*, dvbpsi_handle, uint8_t, uint16_t)>,或者如果您无法修改该代码,请编写extern "C"适配器,例如@ecatmur在评论中提到。

extern "C"适配器只是将C ++代码包装成C函数:

#ifdef __cplusplus
extern "C" {
#endif

void NewEIT(void *priv, dvbpsi_handle h_dvbpsi,
        uint8_t table_id, uint16_t extension);

#ifdef __cplusplus
}
#endif

并在源文件中:

Decoder d;

void NewEIT(void *priv, dvbpsi_handle h_dvbpsi,
        uint8_t table_id, uint16_t extension)
{
    d.NewEIT(priv, h_dvbpsi, table_id, extension);
}