我收到一个我不明白的编译错误(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被原型(prototype)化为带有一个参数的函数,而MAP_ENTRY.pfn是PFN。我在这里想念什么?

最佳答案

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

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

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

为了使它看起来更容易混淆,您可以引入一个中间变量
PFN pfn = p->pfn;
(this->*pfn)(val);

10-07 12:29