Повышение::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.


Другие вопросы по тегам