10

我收到一个我不明白的编译错误(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

4 回答 4

17

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

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

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

为了让它看起来不那么复杂,你可以引入一个中间变量

PFN pfn = p->pfn;
(this->*pfn)(val);
于 2009-12-18T14:26:24.990 回答
8

尝试

return (this->*p->pfn)(val);
于 2009-12-18T14:17:27.050 回答
1

根据我自己的经验,我在 g++ 中遇到了一个由以下语句引起的错误:

  (this -> *stateHandler)() ;

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

(this->*stateHandler)() ;

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

于 2010-09-01T16:55:47.750 回答
-1

p->pfn 是一个函数指针。您需要使用 * 使其起作用。改成

(*(p->pfn))(val)
于 2009-12-18T14:20:46.840 回答