функция-член в аргументе функции

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

//hpp
class first {
public: 
void function (int func(int, int), int, int, int);
void control (void);
};

//cpp

extern first First;
first First;

int f2(int z){
return z*z;
}

void first::function (int f(int, int), int a, int b, int z){
test_displ.sl_x1 = f(a, b); // вывод на дисплей значения функции 
test_displ.sl_x2 = f2(z);   // вывод на дисплей значения функции f2
}

int f1(int x, int y){
return x+y;
}

void first::control(void){  // 10Hz cycle
inter.function(f1, 1, 2, 3);
}   // работающий код

В таком виде все работает, значения на экран выводятся. Мне же нужно, чтобы функция f1 оказалась функцией членом класса second. При написании следующего кода появляется ошибка A pointer to a bound function may only be used to call the function. Я как понял проблема в том, что функция f1 является не свободной, а функцией-членом. Вопрос, как ее переделать, чтобы ниже приведенный код работал?

//hpp
class first {
public: 
void function (int func(int, int), int, int, int);
void control (void);
};

class second {
public:
void f1 (int, int);
}

//cpp

extern first First;
extern second Second;
first First;
second Second;

int f2(int z){
return z*z;
}

void first::function (int f(int, int), int a, int b, int z){
test_displ.sl_x1 = f(a, b); // вывод на дисплей значения функции 
test_displ.sl_x2 = f2(z);   // вывод на дисплей значения функции f2
}

int second::f1(int x, int y){
return x+y;
}

void first::control(void){  // 10Hz cycle
inter.function(Second.f1, 1, 2, 3);
}   // не работающий код

Ответы (1 шт):

Автор решения: Harry

Все запутанно. У вас в объявлении одни типы функций, в реализации другие...
Возможно, вы хотите нечто в этом духе?

class second {
public:
    int f1 (int, int);
};

class first {
public:
    void function(second& s, int (second::*f)(int, int), int a, int b, int z);
    void control (void);
};


first First;
second Second;

int f2(int z){
    return z*z;
}

void first::function(second& s, int (second::*f)(int, int), int a, int b, int z){
    (s.*f)(a, b);
    f2(z);
}

int second::f1(int x, int y){
    return x+y;
}

void first::control(void){  // 10Hz cycle
    function(Second, &second::f1, 1, 2, 3);
}
→ Ссылка