C ++指向成员函数的指针不是函数指针

时间:2016-10-31 00:54:37

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

假设我有以下定义:

function checkNotPaid(passengers) {
    var passengerNotPaid = [];
    for (var i = 0; i < passengers.length; i++) {
        if (!passengers[i].paid) {
            passengerNotPaid.push(passengers[i].name[0]);
        }
    }
    return passengerNotPaid;
}

以下代码正在进行中:

class ScriptInterpreter {
public:
class cell;
typedef ScriptInterpreter::cell (ScriptInterpreter::*proc_t) (const std::vector<cell> &);

class cell {
public:
  proc_t proc;
};

ScriptInterpreter::cell proc_add(const std::vector<cell> & c);
};

在我尝试调用函数指针的行中,我得到了错误

ScriptInterpreter::eval(ScriptInterpreter::cell cell, environment * env)
{
// ...

ScriptInterpreter::cell c;
c.proc = &ScriptInterpreter::proc_add;

return (c.*proc_)(exps);
}

当我在func前添加*时,该行看起来像这样:

error: called object type 'proc_t' (aka 'ScriptInterpreter::cell (ScriptInterpreter::*)(const std::vector<cell> &)') is not
  a function or function pointer

它产生了这个:

ScriptInterpreter::cell c = (proc_cell.*proc_)(exps);

我已经查看了Callback functions in c++以及其他类似的问题,但没有什么能真正给我一些提示错误或提供有关我的错误的任何信息。我绝对没有任何名字两次或类似的东西。 在阅读what is an undeclared identifier error and how do i fix it之后,我很确定我的一切都很好。

那么我做错了什么?

编辑:使用真实代码而不是占位符代码更新代码

1 个答案:

答案 0 :(得分:0)

为了通过指向成员类型的指针调用成员函数,您必须使用运算符.*或运算符->*。在左侧,您必须指定要为其调用该成员函数的对象。

在您的情况下,尝试这样做可能如下所示

A::B b_object;
b_object.func = &A::func_to_call;

A a_object;
A::B other_b_object = (a_object.*b_object.func)();

请注意,由于指针被声明为指向A的成员,因此.*运算符需要左侧的A类型的对象。

但是,在您的具体情况下,由于b_object.func是私有的且无法从main访问,因此格式不正确。

P.S。 int main,而非void main