Boost c++;0x lambdas,不允许我作为函数ptr传递

Boost c++;0x lambdas,不允许我作为函数ptr传递,boost,lambda,bind,boost-asio,c++11,Boost,Lambda,Bind,Boost Asio,C++11,我目前正在用C++0x编写一个程序,我对这个程序相当陌生。 我正在设置对象之间的回调,并使用lambda来匹配类型(比如boost::bind()does) 如果我调用asio库中的函数,如: socket_.async_read_some(buffer(&(pBuf->front()), szBuffer), [=](const boost::system::err

我目前正在用C++0x编写一个程序,我对这个程序相当陌生。
我正在设置对象之间的回调,并使用lambda来匹配类型(比如
boost::bind()
does)

如果我调用asio库中的函数,如:

 socket_.async_read_some(buffer(&(pBuf->front()), szBuffer),                                                    
     [=](const boost::system::error_code &error, size_t byTrans) {                                               
                      this->doneRead(callBack, pBuf, error, byTrans); });
这可以很好地编译,并按预期运行,“doneRead”从“async\u read\u some”回调

因此,我在自己的代码中有一个类似的回调:

client->asyncRead([=](string msg){this->newMsg(msg); });
这只需要一个字符串,asyncReads原型如下

void ClientConnection::asyncRead(void(*callBack)(string)) 
但我得到了这个编译错误:

Server.cpp:在成员函数“void”中 服务器::客户端已接受(标准::共享\u ptr, const boost::system::error_code&'): Server.cpp:31:3:错误:不匹配 用于调用的函数 'ClientConnection::asyncRead(服务器::clientAccepted(std::shared_ptr, 常数 boost::system::error_code&):' Server.cpp:31:3:注意:候选人是: ClientConnection.h:16:9:注意:无效 ClientConnection::asyncRead(无效 (*)(标准::字符串)) ClientConnection.h:16:9:注:否 参数1的已知转换来自 'Server::clientAccepted(std::shared_ptr, 常数 boost::system::error_code&):' 至“void(*)(标准::字符串)”


如何解决此问题?

您的lambda隐式捕获了
。捕获对象的lambda不能转换为原始函数指针

因此,您需要编写
asyncRead
,以便它直接接受lambda函数对象,而不是让它转换为函数指针

template<typename CallbackType>
void ClientConnection::asyncRead(CallbackType callback);
模板
void ClientConnection::asyncRead(CallbackType回调);
或者,如果不想将其作为模板编写,可以使用多态函数对象包装器

void ClientConnection::asyncRead(std::function<void(string)> callBack);
void ClientConnection::asyncRead(std::函数回调);

我也会考虑更改回调的接口,以便它通过const引用接受字符串(除非所有的回调实现本质上都想在内部修改或保存/传递传递的字符串,这在您的情况下似乎不太可能)。p> 您能否共享服务器::客户端已接受。看起来您正在使用提供的回调,并且clientAccepted函数接受的lambda类型与您正在传递的内容不匹配。因此,我不认为您知道第二种方式是否是boost的方式?我现在正试着这样做。是的,这个(第二个)似乎已经用上了,谢谢你的兄弟。