Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.12.205] |
|
Сообщ.
#1
,
|
|
|
Есть 3 класса.
В первом (CLOSLDriver) определен метод CL_ERROR_CODE HashBlock(CFWDataBlock &data_in,CFWDataBlock &data_out,int alg); (CFWDataBlock - мой тип данных, typedef int CL_ERROR_CODE). Из второго класса вызывается метод get_Cookie третьего класса (IKEFieldMaker), которому надо в качестве параметра передать HashBlock. В третьем классе: int get_Cookie(CFWDataBlock *i_cookie, CL_ERROR_CODE (*make_hash)(CFWDataBlock &, CFWDataBlock &, int)); Во втором классе вызываю: the_maker->get_Cookie(&i_cookie, &CLOSLDriver::HashBlock); (the_maker - объект третьего класса). Компилятор выдает: "no matching function fo call to 'IKEFieldMaker::get_Cookie(CFWDataBlock *, CL_ERROR_CODE (CLOSLDriver::*)(CFWDataBlock&, CFWDataBlock&, int))' Candidates are: IKEFieldMaker::get_Cookie(CFWDataBlock *, CL_ERROR_CODE (*)(CFWDataBlock &, CFWDataBlock &, int)) " Пробовал вызывать the_maker->get_Cookie(&i_cookie, the_driver::HashBlock); (the_driver - объект CLOSLDriver) выдается: " no matching function for call to 'IKEFieldMaker::get_Cookie(CFWDataBlock *, <unsigned type>)' " В чем ошибка? Так понимаю проблемма здесь именно в классах, т.к. простой вызов функций работает. |
Сообщ.
#2
,
|
|
|
Дело в том, что передавать нестатические методы класса в качестве callback-функций нельзя (в том виде, в каком у тебя это написано). Если HashBlock не зависит от состояния класса, то сделай ее статической - и твоя проблема решится.
|
Сообщ.
#3
,
|
|
|
Дело в том, что
CL_ERROR_CODE HashBlock(CFWDataBlock &data_in,CFWDataBlock &data_out,int alg); объявленна в абстрактном суперклассе, как виртуальная и этот суперкласс я менять не могу. |
Сообщ.
#4
,
|
|||||||||
|
У тебя в get_Cookie указатель обявлен как
а должен быть по крайней мере объявлен как тебе подсказывает компайлер
(CLOSLDriver::*) означает указатель на мембер класса и ему в отличии от простой функции передается неявно указатель this на объект класса. Просто не указатель на функцию передавай в get_Cookie, а указатель на объект класса CLOSLDriver, а в самой get_Cookie тогда вызывай метод HashBlock Тоесть перепиши на
а внутри функции get_Cookie
А если и третий класс поменять не можешь, тогда напиши обычную функию с подходящей сигнатурой и в ней создавай экземпляр класса CLOSLDriver или его потомка и вызывай метод этого класса. |