我遇到了一个我无法理解的编译错误 (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->*p->pfn)(val)
为了让它看起来不那么复杂,可以引入一个中间变量
PFN pfn = p->pfn;
(this->*pfn)(val);
关于c++ - 如何调用指向成员函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928431/