我在全局函数中使用了成员函数指针:
class ClassA
{
public:
void FuncA(void);
...
}
void GlobalFunc(void)
{
typedef void(ClassA::*MemberFnPtr)(void);
MemberFnPtr fnPtrA = &ClassA::FuncA;
...
}
并且这种模式也能很好地工作(因为operator ::的优先级高于operator&)
typedef void(ClassA::*MemberFnPtr)(void);
MemberFnPtr fnPtrA = &(ClassA::FuncA);
...
但是,当我在成员函数中使用后一种模式时,会出现一些奇怪的内容error C2276:"&"
;
我在std::bind
& std::function
,我认为对我来说会更好。但是,我真的很想知道当我在成员函数中使用后一种模式时会发生什么,有人可以帮忙吗?
答案 0 :(得分:8)
您不应在成员函数名称周围使用括号:
MemberFnPtr fnPtrA = &(ClassA::FuncA); // not good
MemberFnPtr fnPtrA = &ClassA::FuncA; // good
C ++标准在第5.3.1节中明确提到了这一点:
注意:即表达式&(qualified-id),其中包含qualified-id 括号,不形成“指向成员的指针”类型的表达式。
答案 1 :(得分:1)
你必须使用这个表格(正如anatolyg所说):
MemberFnPtr fnPtrA = &ClassA::FuncA;
要调用fnPtrA
,你必须创建一个对象并按如下方式调用它:
ClassA a;
(a.*fnPtrA)();
这是一种奇怪的语法,因为fnPtrA
不是ClassA
的成员。