Тип указателя на функцию C ++ не совместим с кандидатами в Linux и VMS

Этот вопрос связан с моим другим вопросом- boost :: bind возвращает объект функции, который является аргументом функции, для которой требуется указатель

Кроме интерфейса

bridge_set_pound_var_func

не может быть изменено.

Также, boost::function или же boost::bind не работают с большим проектом.

Мой новый код выглядит следующим образом:

#include <iostream>

class myA
{
public:

int bridge_set_pound_var_func(int (*fp)(const char *, char *, void *), void *arg)
{
void * b = NULL;
int a = fp("this is poundVar", "ths is t1", b) ;
std::cout << "bridge_set_pound_var_func is called "<< " , a is " << a << std::endl ;
return 0;

}

};

class myC
{
public:
myA *myOA;
int func(const char * poundVar , char * t1, void * t2);

int myCCall()
{
myA myAO;
myOA = &myAO;
std::cout << "myCCall is called " << std::endl;

myOA->bridge_set_pound_var_func( &myC::func, (void *)this );

return 0;

}

};

int myC::func(const char * poundVar , char * t1, void * t2)
{
std::cout << "myC::func is called " << std::endl;
return 1;

}

int main()
{
myC myCO ;
myC *m1p = &myCO ;
m1p->myCCall() ;

return 0 ;
}

// EOF

Ошибки в Linux:

  In member function 'int myC::myCCall()':

error: no matching function for call to 'myA::bridge_set_pound_var_func(int (myC::*)(const char*, char*, void*), void*)'

candidates are: int myA::bridge_set_pound_var_func(int (*)(const char*, char*, void*), void*)

ошибки на VMS:

 In member function 'int myC::myCCall()':

error: no matching function for call to 'myA::bridge_set_pound_var_func(int (myC::*)(const char*, char*, void*), void*)'

candidates are: int myA::bridge_set_pound_var_func(int (*)(const char*, char*, void*), void*)

0

Решение

Краткий ответ: указатели на функции-члены не указатель на функции. Первым нужно знать об объекте, к которому они обращаются, второму — нет. Типичным подходом является использование обычно представляемых «пользовательских данных». void* чтобы указать на подходящий базовый класс, приведите указатель и вызовите соответствующую виртуальную функцию. Фрим там, вы можете легко восстановить необходимый контекст объекта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]