我在项目中使用SNMP ++库,并且一切正常。但是,有一种方法需要在.mm文件中获取回调。现在,当我创建一个块并将其作为参数传递给该函数时,它将引发错误“没有匹配的成员函数可调用'get_bulk'”。这是一段代码:
void(^callbackFunc)(int,Snmp*,Pdu&,SnmpTarget&,void*);
callbackFunc = ^(int i,Snmp* s,Pdu& p,SnmpTarget& t,void* v) {
};
snmp.get_bulk(pdu, *target, l_repeaters, l_repetitions,callbackFunc);
此外,这是“ get_bulk”函数的函数签名:
int Snmp::get_bulk(Pdu &pdu, // pdu to use
const SnmpTarget &target, // destination target
const int non_repeaters, // number of non repeaters
const int max_reps, // maximum number of repetitions
const snmp_callback callback,// callback to use
const void * callback_data) // callback data
{
pdu.set_type( sNMP_PDU_GETBULK_ASYNC);
return snmp_engine( pdu, non_repeaters, max_reps, target,
callback, callback_data);
}
我应该在“回调”类型中传递什么?
这是SNMP_callback的类型定义:
typedef void (*snmp_callback)(int reason, Snmp *session,
Pdu &pdu, SnmpTarget &target, void *data);
在过去的4-5个小时中,我一直在坚持这一点,我不知道该如何解决。
答案 0 :(得分:0)
Apple的块不能转换为函数指针,因为它们还包含数据(捕获的变量等)和引用计数机制。您将需要传递一个自由函数,静态C ++类成员函数或一个C ++非捕获lambda作为回调。
lambda在语法上最接近块;但是,只有非捕获的lambda可以转换为函数指针,因此,您需要通过void* callback_data
参数传递一个指向上下文结构或类似结构的指针来“手工”进行捕获,这大概是通过传递给回调为void* data
。
lambda看起来像这样:
snmp_callback callback =
[](int reason, Snmp *session, Pdu &pdu, SnmpTarget &target, void *data)
{
// context_struct_type* context = static_cast<context_struct_type*>(data);
};