boost::信号2;没有用于添加信号时隙的匹配功能
boost::signals2; no matching function for adding signal slot
我在一个项目中遇到了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构造。
相关文章:
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 当对话框中的任何小部件发出信号时,是否可以调用插槽
- 为什么我在信号时出现分段错误
- 从主线程向workersread发出信号时出现问题
- QT信号和时隙将变量传递到另一种形式
- PyQt5:使用自定义信号时 int 对象的错误转换
- Qt时隙方法(这是另一类)在发射信号时不触发
- 当 epoll 发出活动信号时,recv() 调用怎么会阻塞
- 接收信号时如何自动化GDB核心转储
- 注册以在 MFC 中发出 Win32 事件信号时接收 Windows 消息
- Qt:有没有什么方法可以调用具有一定时间间隔的时隙序列
- 通过信号和时隙系统调用类函数
- 在 C++11 中,当捕获信号时,如何立即离开函数
- 在子类中覆盖基类信号时连接到基类的信号
- Qt:LNK2001和LNK2019 跨源文件实现信号/时隙后会出现错误
- 在Qt中发送信号时的const-ref
- boost::信号2;没有用于添加信号时隙的匹配功能
- Qt5 信号/时隙语法,带过载信号和 lambda
- Qt在网络上的信号/时隙机制