Нестатические функции-члены не обычные функции. Вы не можете создавать бесплатные указатели на них.
Единственный допустимый способ ссылки на нестатическую функцию-член - через пару указателя / ссылки на экземпляр и функцию указателя на член:
S * p = &theobject;
int (S::*ptmf)() = &S::do_something;
return (p->*ptmf)();
В отличие от члена объектов (на который можно очень хорошо сформировать свободный указатель, например, &theobject.x
), функции-члены более сложны, поскольку вам необходимо учитывать виртуальные функции: если S
полиморфный базовый класс, а p
является указателем на базу, а do_something()
является виртуальным, тогда приведенный выше пример должен выполнить правильный тип отправки. Простой указатель свободной функции не может этого сделать.
(Более того, в стандарте не указывается, как реализуется каждая базовая реализация функций-членов, поэтому эта деталь никогда не предоставляется пользователю. Обычно это будет что-то вроде int S_mangled_name_do_something(S *);
, но это не указано. )
Вот некоторые мои ответы на эту тему: # 1 , # 2 .