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

C++ : member function pointers - Error C3867

本文关键字:错误 C3867 指针 函数 成员 C++      更新时间:2023-10-16

我有以下类:

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);,但它不起作用:(你能帮我吗?

函数指针也包含有关对象实例的信息,它们被称为委托,长期以来都不是C++的标准功能。

自从C++11以来,就有了std::函数。

你应该看看:

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);

一个C++成员函数需要一个不可见的额外参数(this),这使得如上所述获取指向它的指针变得有点棘手。

有点老派的处理方式是"mem_fun"

使其更友好的增强方式是"增强::绑定"

处理它们的稍微现代化的方法是"C++lambda"

然而,只要说一个成员函数可能是类型就足够了

bool (*) (conditionStack *, int)

我敢打赌,如果你真的真的想的话,你可以做到这一点,但正如评论所建议的,请不要。它不是标准的,没有保证,也不可读!

或者,您可以尝试使它们都是静态成员函数(静态函数不接受this参数)。

一条评论说我缺少例子。这是真的。一个例子可能会变得相当大和复杂,而且这个问题还没有很好地定义来证明它的合理性。这里有一个存储Lambda向量的例子:为什么可以';我在C++11中创建一个lambda的向量吗?