C++:成员函数指针-错误C3867
C++ : member function pointers - Error C3867
我有以下类:
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的向量吗?
相关文章:
- 警告处理为错误这里有什么问题
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 如何修复此 FSM C++语法错误 C3867
- 为什么我在对向量的第二个元素"push_back"中有C3867错误
- 在C 中的初学者,我面临此问题错误C3867
- C2276或C3867 C 中的编译器错误
- C++ 中的 substr C3867 错误
- 收到错误:C3867 '<int>Template_class::add':非标准语法;将指针指向带有模板的函数时
- Visual Studio 2015 错误 C3867"矩形::get_area":非标准语法;使用 '&' 创建指向成员的指针
- 可视 C++ 错误 C3867
- “错误 C3867:非标准语法;使用虚拟流操纵器时,使用“&”创建指向成员的指针
- 类错误 C3867 中的 stl 列表
- 错误 1 错误 C3867:"命令::getSecondWord":函数调用缺少参数列表;使用 '&' 创建指向成员的指针
- C++:成员函数指针-错误C3867
- C++Visual Studio 2010,在实现动态堆栈时编译错误C3867
- C++对一个对象向量进行排序,得到错误C3867函数调用缺少参数列表
- 错误C3867:函数调用缺少参数
- 错误 C3867 "数据库::是用户和通行证匹配":非标准语法;使用 '&' 创建指向 Membe 的指针
- 错误C3867,不确定我需要做什么来修复
- 视觉C++错误 C3867 和 C2664