C++ boost::信号2;没有添加信号槽的匹配功能

C++ boost::信号2;没有添加信号槽的匹配功能,c++,boost,boost-signals2,C++,Boost,Boost Signals2,我在一个项目中遇到了boost::signals2的问题。为了给出一个简短的示例,我将代码缩短为以下三个类(所有类都被简化): 类信号参数 { 整数; }; 类插件 { 受保护的: 类型DEF增压::信号2::信号事件; 公众: typedef事件::插槽类型EventHandler; 公众: void addEventHandler(EventHandler和handler) { connect(处理程序); } 私人: 事件一事件; }; 类插件管理器_ { 公众: 插件管理器 { p=新插

我在一个项目中遇到了boost::signals2的问题。为了给出一个简短的示例,我将代码缩短为以下三个类(所有类都被简化):

类信号参数
{
整数;
};
类插件
{
受保护的:
类型DEF增压::信号2::信号事件;
公众:
typedef事件::插槽类型EventHandler;
公众:
void addEventHandler(EventHandler和handler)
{
connect(处理程序);
}
私人:
事件一事件;
};
类插件管理器_
{
公众:
插件管理器
{
p=新插件();
//错误发生在以下行中
p->addEventHandler(boost::bind(&PluginManager::plugin\u事件处理程序,this,_1));
}
私人:
插件*p;
无效插件事件处理程序(信号args和args);
};
在编译时,我总是得到错误 错误:调用“Plugin::addEventHandler(boost::_-bi::bind _-t,boost::_-bi::list2,boost::arg>”)时没有匹配的函数。

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


我监督过什么吗

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

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

    void addEventHandler(EventHandler handler);

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



选项1非常有效。谢谢大家!@彼得斯。即使你认为这不值得,你也愿意发布一个答案吗?在评论中张贴回答材料会歪曲问题,就好像它没有得到回答一样,同时它会阻止其他人回答,因为。。。他们会“窃取”你的评论…@PiotrS。对我来说,
std:{bind,占位符::_1}
没有区别。也许您正在使用MSVC并从它的扩展中获益,该扩展允许临时绑定到非常量引用?
    void addEventHandler(EventHandler handler);
    void addEventHandler(EventHandler const& handler);