我有一个项目,我遇到了boost :: signals2的问题。举一个简短的例子,我将代码缩短为以下三个类(所有类都被简化):
class SignalArgs
{
int a_number_;
};
class Plugin
{
protected:
typedef boost::signals2::signal<void (SignalArgs& args)> Event;
public:
typedef Event::slot_type EventHandler;
public:
void addEventHandler(EventHandler& handler)
{
onEvent.connect(handler);
}
private:
Event onEvent;
};
class PluginManager_
{
public:
PluginManager_()
{
p = new Plugin();
// the error occurs in the following line
p->addEventHandler(boost::bind(&PluginManager_::plugin_event_handler, this, _1));
}
private:
Plugin* p;
void plugin_event_handler(SignalArgs& args);
};
编译时,我总是得到错误 错误:没有匹配函数来调用'Plugin :: addEventHandler(boost :: _ bi :: bind_t,boost :: _ bi :: list2,boost :: arg&lt; 1&gt;&gt;&gt;)'
好的,错误很简单:编译器找不到具有相同类型和数量的参数的函数。我试图通过定义具有确切类型Plugin::EventHandler
的对象(其本身是boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&
的typedef)来绕过它,但没有成功。
我有没有监督过什么?
答案 0 :(得分:2)
boost::bind
返回临时(绑定对象)。此外,转换为slot_type
可能会导致另一个隐式转换 - 导致另一个临时转换。
Temporaries只能(可移植地)绑定到const-references,这意味着你应该将参数更改为
void addEventHandler(EventHandler handler);
或
void addEventHandler(EventHandler const& handler);
在C ++ 03代码中,后者可能会删除副本,而在C ++ 11下,第一个将调用move-construction,因为参数是rvalue。