为什么这种模式不能用在成员函数中?

时间:2015-10-26 11:14:01

标签: c++

我在全局函数中使用了成员函数指针:

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,我认为对我来说会更好。但是,我真的很想知道当我在成员函数中使用后一种模式时会发生什么,有人可以帮忙吗?

2 个答案:

答案 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的成员。