C++11 使用std::bind和std::function时回调失败
有两类服务器和客户端。客户端在服务器上调用方法datas()。服务器使用datacallback()用数据列表响应调用者 调用serverobj.datas()时,我在函数clientfun2中看到编译时错误。请帮我修一下C++11 使用std::bind和std::function时回调失败,c++11,std-function,stdbind,C++11,Std Function,Stdbind,有两类服务器和客户端。客户端在服务器上调用方法datas()。服务器使用datacallback()用数据列表响应调用者 调用serverobj.datas()时,我在函数clientfun2中看到编译时错误。请帮我修一下 #include <iostream> #include <functional> #include <memory> #include <string> #include <vector> enum Status
#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);
}
#包括
#包括
#包括
#包括
#包括
枚举状态{成功,失败,未知};
typedef std::向量数据列表;
类服务器{
公众:
typedef std::函数回调;
无效数据(int请求\u id,回调数据回调){
datalist data;//此处插入数据并将其设置为调用者
std::cout如果我们将std::function
和实际函数放在一起,很容易看到不同之处(重新格式化以更好地显示):
//vvv
typedef std::函数回调;
void clientfun1(内部请求id、状态、数据列表和数据){
// ^^^^^
现在我们可以看到,对于std::function
对象,最后一个参数是对常量的引用,而在clientfun1
函数中,它不是常量
这使得两个函数类型不同,从而导致您的错误。请将错误全文复制粘贴到您的问题中。作为提示:将std::function
中使用的参数与clientfun1
函数进行比较。这些类型完全相同吗?@Someprogrammerdude是的,两者都是相同的typedef std::函数回调;void clientfun1(int-req_-id,Status-Status,datalist&datas)oops这是我的错误。你能帮我解答一个疑问吗。我可以在函数-->void clientfun2(const-server-serverobj)中使用const-serverobj吗?我在某处看到使用const对象和std::bind进行回调。这可能吗?@josp不确定为什么要通过值而不是引用传递server
(server&
),但是,在任何情况下,如果调用的函数是const
,则只能使用const-server
或const-server&
(其中“datas
”不是)。我建议您仔细考虑修改服务器
意味着什么,以及数据
在概念上是修改还是非修改(即常量
)操作。
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> >&)>}’
// vvvvv
typedef std::function<void(int , Status , const datalist&)> Callback;
void clientfun1( int req_id, Status status, datalist& datas) {
// ^^^^^