私は、いくつかのよく知られているデザインパターンを実装することによって、いくつかの基本的なC++ 11の概念を学ぼうとしています。現在、C++で新しいAngular2 EventEmitterパターンを実装しようとしているうちに、Callableに悩まされています。 コメントはすべてがOKであるとどまるのであれば、ここのコードです:静的メンバー関数なしでstd :: bindを使用するには?
class Controller {
public:
Controller() {
const pattern::EventEmitter<SwitchEvent> listner;
listner.subscribe([this](const SwitchEvent& event) {
if(event.get_state()) {
this->_count++;
std::cout << "count: " << this->_count << std::endl;
}
});
//listner.subscribe(std::bind(&Controller::track, this));
}
private:
int _count = 0;
void track(const SwitchEvent& event) {
if(!event.get_state()) {
this->_count++;
std::cout << "count: " << this->_count << std::endl;
}
}
};
と期待通りの出力がある:
$ g++ -std=c++11 -Wall test.cc
$ ./a.out
count: 1
しかし、私はコメントを削除すると、私はエラーを取得:
test.cc: In constructor ‘Controller::Controller()’:
test.cc:50:62: error: no matching function for call to ‘pattern::EventEmitter<SwitchEvent>::subscribe(std::_Bind_helper<false, void (Controller::*)(const SwitchEvent&), Controller*>::type) const’
listner.subscribe(std::bind(&Controller::track, this));
^
test.cc:50:62: note: candidate is:
In file included from test.cc:1:0:
EventEmitter.hh:16:6: note: void pattern::EventEmitter<T>::subscribe(const std::function<void(const T&)>&) const [with T = SwitchEvent]
void subscribe(const std::function<void(const T&)>& listener) const {
^
EventEmitter.hh:16:6: note: no known conversion for argument 1 from ‘std::_Bind_helper<false, void (Controller::*)(const SwitchEvent&), Controller*>::type {aka std::_Bind<std::_Mem_fn<void (Controller::*)(const SwitchEvent&)>(Controller*)>}’ to ‘const std::function<void(const SwitchEvent&)>&’
g ++のどのバージョンですか? --std = C++ 14は役に立ちますか? –