在头文件iec61850_server.h中有这样一个函数声明:
LIB61850_API void IedServer_setRCBEventHandler(IedServer self, IedServer_RCBEventHandler handler, void* parameter);
原例程的调用方式是这样:
#include "iec61850_server.h"
static IedServer iedServer;
static void rcbEventHandler(void* parameter, ReportControlBlock* rcb, ClientConnection connection, IedServer_RCBEventType event, const char* parameterName, MmsDataAccessError serviceError)
{
printf("RCB: %s event: %i\n", ReportControlBlock_getName(rcb), event);
......
}
int main(int argc, char** argv)
{
......
IedServer_setRCBEventHandler(iedServer, rcbEventHandler, NULL);
......
return 0;
}
我想改成面向对象的方式,放在一个类里面去调用,如下:
#include "iec61850_server.h"
static IedServer iedServer;
mms_server::mms_server()
{
}
mms_server::~mms_server()
{
}
void mms_server::rcbEventHandler(void* parameter, ReportControlBlock* rcb, ClientConnection connection, IedServer_RCBEventType event, const char* parameterName, MmsDataAccessError serviceError)
{
......
IedServer_setRCBEventHandler(iedServer, rcbEventHandler, NULL);
......
return 0;
}
int mms_server::mms_run()
{
.........
IedServer_setRCBEventHandler(iedServer, rcbEventHandler, NULL);
......
return 0;
}
然后就开始报错了,如下:
没想明白,“rcbEventHandler”这个参数为什么一定要定义成静态函数呢?定义成类成员函数就不行吗?我知道静态函数内不能调用非静态的东西,这个好像也不是吧!
请问要怎么修改,我不想把rcbEventHandler这个函数改成静态的,还是想保留其类成员函数的形式。
后附:看了最近的13个回答,似乎没有一个能编译通过的方案。无论是使用使用静态成员函数和类实例指针,还是使用std::function和std::bind,或者lambda,都需要把新产生的函数句柄作为参数传递给此回调函数“IedServer_setRCBEventHandler(iedServer, rcbEventHandler, NULL);”的第二个参数,就会产生类型不匹配的错误,类型强制转换也不行。 第二个参数是IedServer_RCBEventHandler类型的函数句柄,答案中的几种方式最后传到这里时都会报类型转换错误。