Повышение::signals2; нет соответствующей функции для добавления сигнального слота
У меня есть проект, где у меня есть проблема с boost:: signal2. Чтобы привести короткий пример, я сократил код до следующих трех классов (все классы упрощены):
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<1> > >)'
Хорошо, ошибка проста: компилятор не нашел функцию с таким же типом и количеством параметров. Я попытался обойти это с определением объекта с точным типом Plugin::EventHandler
(Что само по себе является typedef для boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&
), но безуспешно.
Я что-то наблюдал?
1 ответ
boost::bind
возвращает временный объект (объект привязки). Кроме того, преобразование в slot_type
скорее всего, произойдет еще одно неявное преобразование, что приведет к еще одному временному
Временные файлы могут (только переносимо) связываться с const-ссылками, что означает, что вы должны изменить аргумент на
void addEventHandler(EventHandler handler);
или же
void addEventHandler(EventHandler const& handler);
В коде C++03 последний может исключить копию, тогда как в C++11 первый вызовет конструкцию move, так как параметр является значением r.