对于一个类,我想将一些指向同一类的成员函数的函数指针存储在一个map存储std::function对象中。但是我一开始就用这段代码失败了:
map
std::function
#include <functional> class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } };
我收到error C2064: term does not evaluate to a function taking 0 arguments了xxcallobj一些奇怪的模板实例化错误。目前,我正在使用 Visual Studio 2010/2011 使用 Windows 8,使用 VS10 使用 Win 7,它也失败了。该错误必须基于我不遵循的一些奇怪的 C++ 规则
error C2064: term does not evaluate to a function taking 0 arguments
xxcallobj
必须使用对象调用非静态成员函数。也就是说,它总是隐式地传递“this”指针作为它的参数。
因为您的std::function签名指定您的函数不接受任何参数 ( <void(void)>),所以您必须 绑定 第一个(也是唯一的)参数。
<void(void)>
std::function<void(void)> f = std::bind(&Foo::doSomething, this);
如果要绑定带参数的函数,需要指定占位符:
using namespace std::placeholders; std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
或者,如果您的编译器支持 C++11 lambda:
std::function<void(int,int)> f = [=](int a, int b) { this->doSomethingArgs(a, b); }
(我现在 手头没有支持 C++11 的编译器,所以我无法检查这个。)