У меня немного сложный класс.
В этом классе у меня есть ссылка:
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
Вот хорошая статья, которая говорит о членских указателях.
В этом случае компилятор находит проблему в синтаксисе
используйте следующую строку кода
pIEtApi-> SetRawDataCB ((длинный) (_int64) (&CETAPI :: RawDataCB), 0,&результат);
см. ссылку для получения дополнительной информации Описание кода ошибки