c++11 - 使用 std::bind 和 std::function 时回调失败
问题描述
有两个类服务器和客户端。客户端调用服务器上的方法datas()。服务器使用datacallback()以数据列表响应调用者。
当调用 serverobj.datas()时,我在函数clientfun2中看到编译时错误。请帮助修复它。
#include <iostream>
#include <functional>
#include <memory>
#include <string>
#include <vector>
enum Status { SUCCESS, FAILED, UNKOWN };
typedef std::vector<std::string> datalist;
class server {
public:
typedef std::function<void(int, Status, const datalist&)> Callback;
void datas(int request_id, Callback datacallback) {
datalist data; //here data is inserted and set to caller
std::cout << "Invoked datas method\n";
datacallback(123, SUCCESS, data); // sending back to caller
}
};
class client {
public:
void clientfun1(int req_id, Status status, datalist& datas) {
std::cout << "Invoked clientfun1\n";
}
void clientfun2(server serverobj) {
serverobj.datas(123,
std::bind(&client::clientfun1, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3)); /*Here the error comming pls help to fix */
}
};
int main() {
server serverobj;
client clientobj;
clientobj.clientfun2(serverobj);
}
****文本格式错误****
bind.cc: In member function ‘void client::clientfun2(server)’:
bind.cc:30:76: error: no matching function for call to ‘server::datas(int, std::_Bind_helper<false, void (client::*)(int, Status, std::vector<std::__cxx11::basic_string<char> >&), client*, const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&>::type)’
std::placeholders::_2, std::placeholders::_3));
^
bind.cc:14:8: note: candidate: void server::datas(int, server::Callback)
void datas(int request_id, Callback datacallback) {
^
bind.cc:14:8: note: no known conversion for argument 2 from ‘std::_Bind_helper<false, void (client::*)(int, Status, std::vector<std::__cxx11::basic_string<char> >&), client*, const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&>::type {aka std::_Bind<std::_Mem_fn<void (client::*)(int, Status, std::vector<std::__cxx11::basic_string<char> >&)>(client*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>)>}’ to ‘server::Callback {aka std::function<void(int, Status, const std::vector<std::__cxx11::basic_string<char> >&)>}’
解决方案
如果我们将 thestd::function
和实际函数放在一起,很容易看出差异(重新格式化以更好地显示它):
// vvvvv
typedef std::function<void(int , Status , const datalist&)> Callback;
void clientfun1( int req_id, Status status, datalist& datas) {
// ^^^^^
现在我们可以看到std::function
对象的最后一个参数是对常量 datalist
的引用,而在clientfun1
函数中它不是常量。
这使得两种函数类型不同,从而导致您的错误。
推荐阅读
- c# - .Net Core 不支持 UserPasswordCredential
- ionic-framework - Ionic 4:当我尝试使用 ionic serve 运行我的项目时出错
- javascript - 如何将两个数组放入新数组中
- r - 重新采样或聚合大型栅格限制内存使用 R
- istio - 如何让 istio 解析自定义主机
- ffmpeg - 如何使用 ffmpeg 快速获取屏幕截图
- dialog - Bot Framework V4 Dialog 等待用户输入而不提示
- javascript - Polymer 3 开发指南“外部元素上的侦听器”中的事件示例引发异常
- groovy - 分片 Shpere setActualDataNodes {0000..1023}
- ibm-watson - 如何处理连接到 Watson IOT Platform 的 IOT 设备的 SSL 证书到期