我使用相同的代码部分一直在努力工作几个小时,我找不到任何可以指导我的答案。
我正在使用库,并且方法需要将回调作为参数传递。请参阅here。
PubSubClient& setCallback(MQTT_CALLBACK_SIGNATURE);
我试图从成员函数触发此方法,如下所示:
void HouseKeeper::callback(char* topic, uint8_t* payload, unsigned int length) {
// Do something
}
boolean HouseKeeper::connect() {
library.setCallback(callback);
}
错误编译器给出的是:
no matching function for call to
'PubSubClient::setCallback(<unresolved overloaded function type>)'
note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::function<void(char*, unsigned char*, unsigned int)>'
我对C ++很新,所以即使是基础知识仍然离我很远。
答案 0 :(得分:4)
成员函数将*this
指针作为第一个参数,因此您的函数签名实际上是:
void(HouseKeeper*, char*, uint8_t*, unsigned int)
虽然库setCallback函数中的std :: function需要:
std::function<void(char*, unsigned char*, unsigned int)>.
您必须在回调第二个参数中更改uint8_t*
到unsigned char*
(感谢 Daniel H ),并且还要删除隐式*this
。< / p>
您可以使用std :: bind 绑定*this
指针以匹配setCallback()签名:
std::function<void(char*, uint8_t*, unsigned int)> yourFunction = std::bind(&HouseKeeper::callback, this, _1, _2, _3);
library.setCallback(yourFunction);
或者用lambda函数包裹你的电话:
std::function<void(char*, uint8_t*, unsigned int)> yourFunction = [=](char* topic, uint8_t* payload, unsigned int length) {
this->callback(topic, payload, length);
}
library.setCallback(yourFunction);
答案 1 :(得分:0)
&#34;经典&#34;使用回调的方法是声明你的回调函数是静态的。