【问题标题】:How do I call a pointer-to-member-function?如何调用指向成员函数的指针?
【发布时间】:2010-12-28 01:23:26
【问题描述】:

我遇到了一个我无法理解的编译错误(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。我在这里错过了什么?

【问题讨论】:

  • C 语法生锈了,所以不作为答案添加,不应该是“return (*(p->pfn))(val);”吗? ——
  • 不,这会产生错误“* 在 C::PFN 类型的操作数上非法”。

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


【解决方案1】:

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

  (this -> *stateHandler)() ;

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

(this->*stateHandler)() ;

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      试试

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

      【讨论】:

      • 是的!而已。非常感谢。你们真是难以置信。我搞砸了几个小时,不到 10 分钟就得到了答案。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-10
        • 2013-01-26
        • 1970-01-01
        • 2012-12-16
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多