0

我有一个项目,我对 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<1> > >)'

好的,错误很简单:编译器没有找到具有相同类型和参数数量的函数。我试图通过定义一个具有确切类型的对象来绕过它Plugin::EventHandler(它本身就是一个 typedef to boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >&),但没有成功。

我监督了什么吗?

4

1 回答 1

2

boost::bind返回一个临时的(绑定对象)。此外,转换为slot_type可能会导致另一个隐式转换 - 导致另一个临时转换。

临时对象只能(可移植地)绑定到 const-references,这意味着您应该将参数更改为

    void addEventHandler(EventHandler handler);

或者

    void addEventHandler(EventHandler const& handler);

在 C++03 代码中,后者可能会消除一个副本,而在 C++11 中,第一个代码将调用移动构造,因为参数是一个右值。


于 2014-09-03T13:41:58.427 回答