如何调用指向成员的指针函数?

时间:2009-12-18 14:14:24

标签: c++ compiler-errors member-function-pointers

我收到了一个我不明白的编译错误(MS VS 2008)。在弄乱了好几个小时之后,这一切都很模糊,我觉得有一些非常明显(而且非常愚蠢)的东西,我很想念。这是基本代码:

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }

编译器在箭头处声称“术语不评估为采用1参数的函数”。为什么不? PFN原型为带有一个参数的函数,MAP_ENTRY.pfn是PFN。我在这里缺少什么?

4 个答案:

答案 0 :(得分:17)

p->pfn是指向成员函数类型的指针。为了通过这样的指针调用函数,您需要使用运算符->*或运算符.*,并提供类型为C的对象作为左操作数。你没有。

我不知道在这里应该使用哪个C类型的对象 - 只有你知道 - 但在你的例子中,可能是 *this。在这种情况下,呼叫可能如下所示

(this->*p->pfn)(val)

为了使它看起来有点复杂,你可以引入一个中间变量

PFN pfn = p->pfn;
(this->*pfn)(val);

答案 1 :(得分:8)

尝试

return (this->*p->pfn)(val);

答案 2 :(得分:1)

为了说明我自己的经验,我遇到了由此声明引起的g ++错误:

  (this -> *stateHandler)() ;

其中stateHandler是指向* this引用的类的void成员函数的指针。问题是由箭头操作符之间的空格引起的。以下代码段编译正常:

(this->*stateHandler)() ;

我正在使用g ++(GCC)4.4.2 20090825(预发行版)。 FWIW。

答案 3 :(得分:-1)

p-&gt; pfn是一个函数指针。你需要使用*才能使它发挥作用。改为

(*(p->pfn))(val)