我有这个有效的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);
答案 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);
}