#include <functional>
struct A
{
int func(int x, int y)
{
return x+y;
}
};
int main()
{
typedef std::function<int(int, int) > Funcp;
A a;
//Funcp func = std:::bind(&A::func, &a);
Funcp func = std::bind(&A::func, a, std::placeholders::_1);
return 0;
}
我在上述两个绑定函数中都出现了错误。
error C2825: '_Fty': must be a class or namespace when followed by '::'
语法错误在哪里?我使用的是visual studio 2010
Funcp func = std::bind(&A::func, &a, std::placeholders::_1, std::placeholders::_2);
我花了点时间才弄明白发生了什么。所以把它添加到这里,以方便其他人,解释一下会有帮助。为了更加清晰,我对一些函数和变量进行了重命名。
#include <functional>
struct A
{
int MemberFunc(int x, int y)
{
return x+y;
}
};
int main()
{
typedef std::function<int(int, int) > OrdinaryFunc;
A a;
OrdinaryFunc ofunc = std::bind(&A::MemberFunc, a, std::placeholders::_1, std::placeholders::_2);
int z = ofunc(10, 20); // Invoke like an ordinary function
return 0;
}
类成员函数有一个指向对象的隐含参数(this
指针)。) 这些成员函数只有通过提供一个对象才能被调用,这使得它与普通函数不同。
std::bind
可以用来将成员函数 "转换 "为普通函数。在新函数中,对象是 束缚 到成员函数的 implicithidden 参数,并且在调用时不需要传递。未绑定的参数用占位符来表示。_1
, _2
并在调用时必须通过。