Я использовал указатель на функцию-член в глобальной функции:

class ClassA
{
public:
    void FuncA(void);
    ...
}
void GlobalFunc(void)
{
    typedef void(ClassA::*MemberFnPtr)(void);
    MemberFnPtr fnPtrA = &ClassA::FuncA;
    ...
}

И такой шаблон также отлично работал (поскольку оператор :: имеет более высокий приоритет, чем оператор &)

typedef void(ClassA::*MemberFnPtr)(void);
MemberFnPtr fnPtrA = &(ClassA::FuncA);
...

Однако, когда я использовал последний шаблон в функции-члене, появляется что-то странное error C2276:"&";

Я кое-что читал на std::bind и std::function, и думаю, что мне так будет лучше. Однако мне действительно интересно, что произошло, когда я использовал последний шаблон в функции-члене, может ли кто-нибудь помочь?

c++
3
Zhaoyu.Wang 26 Окт 2015 в 14:14

2 ответа

Лучший ответ

Вы не должны использовать круглые скобки вокруг имени функции-члена:

MemberFnPtr fnPtrA = &(ClassA::FuncA); // not good
MemberFnPtr fnPtrA = &ClassA::FuncA; // good

Стандарт C ++ прямо упоминает об этом в разделе 5.3.1:

Примечание: то есть выражение & (квалифицированный-идентификатор), где квалифицированный-идентификатор заключен в круглые скобки, не формирует выражение типа «указатель на член».

8
anatolyg 26 Окт 2015 в 11:28

Вы должны использовать эту форму (как сказал анатолиг):

MemberFnPtr fnPtrA = &ClassA::FuncA;

Для вызова fnPtrA вы должны создать объект и вызвать его, как показано ниже:

ClassA a;
(a.*fnPtrA)();

Это странный синтаксис, поскольку fnPtrA не является членом ClassA.

1
masoud 26 Окт 2015 в 11:39