Сигнатура функции-члена класса, отличного от static
, отличается от обычной функции.
Например,
class X {
public:
void foo ();
};
void foo ();
В приведенном выше случае X::foo()
и ::foo()
отличаются друг от друга. Помните, что X::foo()
под капотом примерно так:
void X::foo (X* const this);
^^^^^ implicitly added
Таким образом, то, что вы пытаетесь сделать, приведет к неопределенному поведению .
Если вы настаиваете на вызове функции-члена с использованием ее адреса, то лучше сделать ее static
функцией-членом.
class X {
public:
static void foo ();
};
void foo ();
Подпись для X::foo()
и ::foo()
одинакова.
Редактировать : Из вашего комментария кажется, что вы не можете контролировать исходный код. Я бы предложил использовать правильное соглашение о вызовах для сигнатуры функции вместо жестко закодированного адреса. Псевдокод
typedef void (GameAudio::*caller_type)();
caller_type caller = &GameAudio::StopAllSounds;
GameAudio object;
(object.*caller)();