c++ - boost::信号2;没有添加信号槽的匹配函数

标签 c++ boost boost-signals2

我有一个项目在使用 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 的对象来绕过它(它本身是 boost::signals2::slot1<void, SignalArgs, boost::function<void(SignalArgs)> >& 的类型定义),但没有成功。

我是否监督了什么?

最佳答案

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

临时对象只能(可移植地)绑定(bind)到常量引用,这意味着您应该将参数更改为其中之一

    void addEventHandler(EventHandler handler);

    void addEventHandler(EventHandler const& handler);

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


关于c++ - boost::信号2;没有添加信号槽的匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641230/

相关文章:

c++ - 在不使用 extern "C"的情况下从 C 调用 C++ 函数

c++ - __attribute__((__packed__)); 之间有什么区别?和#pragma pack(1)

c++ - 如何管理指向已引用对象内部数据的 shared_ptr?

c++ - boost 线程 - 使用局部变量作为参数

c++ - 是否有一个通用的 boost::XXX::stream_protocol::socket 可以从 local::stream_protocol::socket 或 ip::tcp::socket 移动构造?

c++ - boost 信号 : Expose signal itself or connect/disconnect methods in class interface?

c++ - Boost.Signals 弃用

c++ - 如何为 Visual Studio Clang-Format 插件提供 clang 格式文件?

c++ - boost::regex 中的嵌套量词

linux - Sigalrm(linux信号)