我正在使用boost :: signals2 :: signal实现一个Dispatcher类。到目前为止,我已经成功使用了没有参数的信号,但是我试图用参数来实现它们。
Dispatcher看起来像这样:
#include "boost/signals2.hpp"
using namespace boost::signals2;
class Dispatcher {
public:
signal<void ()> signal1;
signal<void (int)> signal2;
};
有一个Controller类,其函数绑定到从Dispatcher调度的信号:
class Controller {
public:
void onSignal1() {
cout << "onSignal1()" << endl;
}
void onSignal2(int n) {
count << "onSignal2()" << n << endl;
}
};
在主类中Dispatcher信号绑定到Controller函数:
Dispatcher dispatcher;
Controller controller;
dispatcher.signal1.connect(boost::bind(&atlas::Controller::onSignal1, & controller));
dispatcher.signal1();
dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, std::_1));
dispatcher.signal2(42);
这不会编译。这是错误: /boost/boost/bind/bind.hpp:313:9:没有匹配函数来调用'boost :: _ mfi :: mf1'类型的对象
如果主文件的最后两行被注释掉,一切都按预期工作。只有当我尝试将第二个信号连接到函数onSignal2
时才会发生故障。
答案 0 :(得分:0)
你必须使用它:
dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, _1));
而不是:
dispatcher.signal2.connect(boost::bind(&atlas::Controller::onSignal2, & controller, std::_1));
<强>原理强>
你必须使用boost占位符而不是std占位符(因为你使用的是boost :: bind而不是std :: bind) http://www.boost.org/doc/libs/1_57_0/boost/bind/placeholders.hpp http://en.cppreference.com/w/cpp/utility/functional/placeholders