我的课有点复杂。
在这个课上,我有一个参考:
Private:
IEtApiPtr _pIEtApi;
IEtApiPtr在.tlh文件中定义:
_COM_SMARTPTR_TYPEDEF(IEtApi, __uuidof(IEtApi));
IEtApiPtr具有一个名为“ SetRawDataCB”的空白
virtual HRESULT __stdcall SetRawDataCB (
/*[in]*/ long address,
/*[in]*/ long userData,
/*[out,retval]*/ enum ApiError * pRetVal ) = 0;
我在该类中定义了一个回调函数:
void CETAPI::RawDataCB(RawData& r, void* userData)
{
//do something
}
现在我想使用安装回调
_pIEtApi->SetRawDataCB((long)(__int64)(&RawDataCB),0,&result);
...编译器告诉我“错误C2276:绑定成员函数的表达式无效的操作”。
我在这里做错了什么?
这是行不通的,因为RawDataCB
成员函数不是全局函数。您可以RawDataCB
按如下所示在类中声明为静态函数,这将起作用。但是,this
除非您将其作为参数添加到RawDataCB
并可能成为RawDataCB
朋友(如成员函数那样)来访问该类的私有数据,否则您将不再有权访问该指针(即没有成员变量)。可以通过如下更新函数声明来完成:
class CETAPI {
static void RawDataCB(RawData& r, void* userData);
};
或者,您可以将指针传递RawDataCB
为成员函数指针,而不是函数指针。成员函数指针可以按以下方式进行操作,因此您只需将类型的对象传递RawDataCBType
给即可SetRawDataCB
。
typedef void (CETAPI::*RawDataCBType)(RawData&, void*); // typedef the member function pointer type
RawDataCBType pmf = &CETAPI::RawDataCB; // create and initialize a pointer to the member function
pCETAPIObject->*pmf(r, userData); // call the member function on an object of type CETAPI
这是一篇很好的文章,讨论了成员指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句