Ваш первый вариант является правильным, если рассматривается конкретный вопрос взятия адреса. Нет ограничений по получению адреса функций-членов локальных классов. Правильный синтаксис обычный
&NestedClass::someFunction
и все. Вы можете попробовать сохранить его в промежуточном указателе в вашем коде
void (NestedClass::*ptr)() = &NestedClass::someFunction;
и я уверен, что ваш компилятор примет это.
Однако проблема, которая, как я подозреваю, существует в вашем коде, не имеет абсолютно никакого отношения к правильному способу получения адреса функции-члена. Это скорее способ объявления первого параметра setupCallback
. Поскольку вы говорите, что он работает с &SomeClass::someFunction
в качестве первого аргумента, я ожидаю, что setupCallback
будет объявлено как
void setupCallback(void (SomeClass::*cb)(), SomeClass *p); // one possibility
т.е. жестко запрограммирован , чтобы ожидать указатель на член SomeClass
в частности. Вместо этого вы не можете указать указатель на член NestedClass
. NestedClass
совершенно не связан с SomeClass
, а указатели на члены NestedClass
полностью несовместимы с указателями на члены SomeClass
. Вот почему он не скомпилируется.
Если вы что-то нам не показываете (например, setupCallback
может быть шаблоном функции? Или перегружен для разных типов параметров?), То, что вы пытаетесь сделать, просто невозможно достичь независимо от того, как вы берете адрес члена До тех пор, пока NestedClass
не имеет отношения к SomeClass
. Функция setupCallback
предназначена для работы только с SomeClass
и SomeClass
.
Укажите дополнительную информацию о setupCallback
. Как это объявлено?
Обратите внимание, что если setupCallback
объявлен как шаблон функции, параметризованный типом класса, как в
template <class T> void setupCallback(void (T::*cb)(), T* p);
тогда вы не сможете использовать локальный класс NestedClass
в качестве аргумента шаблона для параметра T
. В этом случае тот факт, что ваш NestedClass
не имеет связи, действительно вступает в игру. Но, опять же, это не имеет ничего общего с получением адреса члена, а скорее связано с тем, что классы без связи не могут использоваться в качестве аргументов шаблона в C ++.