C ++:成员函数指针 - 错误C3867

时间:2014-11-04 17:42:29

标签: c++ member-function-pointers

我有以下课程:

class conditionStack : public Stack
{   
public:
    bool even(int);
    bool odd(int);
    bool positive(int);

    void push(bool(*)(int), int);
};

推送功能:

void conditionStack::push(bool (*p)(int), int a)
{
    if (p(a))
        Stack::push(a); 
}

我按照以下方式在main.cpp中调用函数

conditionStack Even;
Even.push(Even.even, value);

但结果是出现以下错误

error C3867: 'conditionStack::even': function call missing argument list; use '&conditionStack::even' to create a pointer to member 

我试着将其称为Even.push(&conditionStack::even, value);但它不起作用:(你能帮助我吗?

2 个答案:

答案 0 :(得分:0)

一个C ++成员函数接受一个不可见的额外参数(this),它使得指向它的指针比上面有点棘手。

处理它们的稍微老一点的方法是“mem_fun”

使其更友好的提升方式是“boost :: bind”

处理它们的稍微现代的方法是“C ++ lambda”

但是,我只想说成员函数的类型可能是:

bool (*) (conditionStack *, int)

我敢打赌如果你真的非常想要你可以做到这一点,但正如评论所暗示的那样,请不要。这不是标准,不保证,也不可读!

或者,您可以尝试将它们全部设为静态成员函数(静态函数不接受此参数)。

评论说我缺乏例子。这是真的。一个例子可能已经变得非常庞大和复杂,而且问题还不够明确,无法证明它(还)。这里有一个存储lambdas向量的例子:Why can't I create a vector of lambda in C++11?

答案 1 :(得分:0)

也包含有关对象实例的信息的函数指针称为委托,并且在C ++中很长时间没有标准功能。

从C ++ 11开始,有std :: function。

你应该看看它:

http://en.cppreference.com/w/cpp/utility/functional/function

其中一个例子展示了你想要的东西:

// store a call to a member function
std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
const Foo foo(314159);
f_add_display(foo, 1);