С++: использование указателей функций с функциями-членами

Я пытаюсь передать функцию другой функции в качестве параметра, и оба они являются функциями-членами одного и того же класса.

Я получаю странную ошибку, и я не могу понять, в чем проблема.

Вот мои функции:

void myClass::functionToPass()
{
   // does something
}

void myClass::function1(void (*passedFunction)())
{
   (*passedFunction)();
}

void myClass::function2()
{
   function1( &myClass::functionToPass );
}

Однако я получаю следующую ошибку:

   cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
   to 'void(__cdecl*)(void)'

Итак, что дает? Я чувствую, что я пробовал все варианты, чтобы попытаться заставить это работать. Можете ли вы даже передать указатели функций для функций-членов? Как я могу заставить это работать?

Примечание. Создание staticToPass static не является действительно допустимым вариантом.

Ответ 1

Вы можете передавать указатели на функции-члены. Но это не то, что делает ваш код. Вы путаетесь между регулярными указателями функций (void (*passedFunction)() является регулярным указателем функции) и указателями на функции-члены (&myClass::functionToPass является указателем на функцию-член). Они не одно и то же, и они несовместимы.

Вы можете переписать свой код следующим образом

void myClass::function1(void (myClass::*passedFunction)())
{
   (this->*passedFunction)();
}

Теперь ваш код использует указатели на функции-члены, но, конечно, это означает, что вы не сможете передать обычный указатель функции.

Ответ 2

Как указывалось другими, ваша ошибка заключается в типе передаваемого указателя функции. Он должен быть void (myClass::*passedFunction)().

Вот хороший учебник по использованию указателей на функции-члены в С++.