我们的一个类提供了 tr1::function 回调对象。但是,当我尝试为其分配成员函数时,出现编译器错误。
以下示例未经测试,仅用于说明:
Foo.h:
class Foo()
{
public:
Foo();
std::tr1::function<void (int x)> F;
}
Bar.h:
class Bar()
{
public:
Bar();
Foo* foo;
void HookUpToFoo();
void Respond(int x);
}
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
。这使得它与您的不兼容function
只接受一个参数的对象。您可以使用以下方法将成员函数绑定到特定实例bind
,这也可以在tr1
:
using namespace std::tr1::placeholders;
this->foo->F = std::tr1::bind(&Bar::Respond, this, _1);
这确保了Bar::Respond
将使用绑定到的正确值进行调用this
. The _1
是附加参数的占位符 (x
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)