【问题标题】:Calling object method saved in structure (MSVC2010)调用保存在结构中的对象方法 (MSVC2010)
【发布时间】:2015-10-08 16:03:28
【问题描述】:

有一个结构:

scheduled_call {
    MyClass* object;
    int value;
    void (MyClass::*setter)(const int)
}

类:

MyClass {
    void doSomething(const int);
}

结构编译得很好,但是当我尝试将值调用为函数时,它会抛出错误:

我需要执行保存在这个结构中的调用。我试过这个:

void executeIt(scheduled_call cl) {
    cl.object->*(cl.method)(cl.value);
}

但我明白了:

error C2064: term does not evaluate to a function taking 1 arguments

我的编码基于C/C++ function pointer guide。我这样做是为了做一个实验,如果失败了,我当然可以退回到switch 声明。

任何人都可以在 Visual Studio 2010 下编译这个吗?

【问题讨论】:

  • This post(第二个答案)是成员函数指针语法的一个很好的参考。

标签: c++ visual-studio-2010


【解决方案1】:

您需要在struct 中提供有效的成员函数指针定义:

scheduled_call {
    MyClass* object;
    int value;
    void (MyClass::*method)(int); // <<<<
}

【讨论】:

  • 您好,真的很抱歉,我在写问题的时候不小心造成了这个错误。我的实际代码在结构中如下所示:void (ComplexStyle::ValueCondition::*setter)(const QString &amp;); 并且它可以编译。不能编译的是调用,而不是定义。
【解决方案2】:
void MyClass::*method;

不是指向类成员函数的有效函数指针。为此,我们需要

void (MyClass::*method)(int)

现在的method 是指向函数的指针,如MyClass::doSomething()

【讨论】:

  • @tobi303 我不确定,因为我没有看到那个语法。
  • @πάνταῥεῖ 因为我们不能有一个 void 成员变量,它仍然是错误的吗?
  • @tobi303 指向 void 类型的成员变量的指针,这显然不是有效的声明,不应编译,但我不确定标准对此有何规定。跨度>
  • @brunocodutra 我也认为它不应该编译,但 OP 可能没有显示所有错误消息。
  • @πάνταῥεῖ 我之前没有尝试过(因为我必须去取公共汽车;),现在我做了,编译器确实说error: cannot declare pointer to 'void' member
【解决方案3】:

问题出在方法调用上。这是错误

cl.object->*(cl.method)(cl.value);

这是正确

(cl.object->*cl.method)(cl.value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多