boost::信号2;没有用于添加信号时隙的匹配功能

boost::signals2; no matching function for adding signal slot

本文关键字:信号 时隙 功能 添加 boost 用于      更新时间:2023-10-16

我在一个项目中遇到了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>>>)"

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

我监督了什么吗?

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

临时变量只能(可移植)绑定到常量引用,这意味着您应该将参数更改为

    void addEventHandler(EventHandler handler);

    void addEventHandler(EventHandler const& handler);

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