C++ C++;:将函数分配给tr1::function对象

C++ C++;:将函数分配给tr1::function对象,c++,delegates,tr1,C++,Delegates,Tr1,我们的一个类提供了tr1::函数回调对象。但是,当我尝试为它分配一个成员函数时,我得到了一个编译器错误 以下示例未经测试,仅用于说明: Foo.h: class Foo() { public: Foo(); std::tr1::function<void (int x)> F; } Bar.cpp: Bar() { this->foo = new Foo(); this->HookUpToFoo(); } void Bar::HookUpToF

我们的一个类提供了tr1::函数回调对象。但是,当我尝试为它分配一个成员函数时,我得到了一个编译器错误

以下示例未经测试,仅用于说明:

Foo.h:

class Foo()
{
public:
  Foo();
  std::tr1::function<void (int x)> F;
}
Bar.cpp:

Bar()
{
    this->foo = new Foo();
    this->HookUpToFoo();
}

void Bar::HookUpToFoo()
{
  this->foo->F = &Bar::Respond; // error
}

void Bar::Respond(int x)
{
       // do stuff
}
我们得到的编译器错误引用了xrefwrap中的一行,并且是 错误1错误C2296:“.*”:非法,左操作数的类型为“int”C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xrefwrap 64


…我在分配代表时做错了什么?我想走更现代的路线,使用tr1::function而不是函数指针。

成员函数接受一个额外的隐藏参数:
this
。这使得它与只接受一个参数的
函数
对象不兼容。您可以使用
bind
将成员函数绑定到特定实例,这也可以在
tr1
中找到:

using namespace std::tr1::placeholders;

this->foo->F = std::tr1::bind(&Bar::Respond, this, _1);

这将确保调用
Bar::Respond
,并将正确的值绑定到
This
\u 1
是附加参数(
x
)的占位符。

Bar::Respond
是成员函数,而不是函数。如果没有
this
,则无法调用它。这与
void(条::*)(int)
成员函数指针和
void(*)(int)
函数指针之间的差异相同

您可以使用
mem\u fn
从成员函数创建
函数
对象

F = std::bind1st(std::tr1::mem_fn(&Bar::Respond), this);

或者干脆
std::tr1::bind(&Bar::Respond,this)
,没有占位符。@Alexandre:没有占位符对我不起作用:谢谢,interjay,当我使用bind而不是assign with=。注意:我还必须使用占位符,否则它不会编译。
F = std::bind1st(std::tr1::mem_fn(&Bar::Respond), this);