2011-11-17 58 views
1

我尝试以下操作:的boost ::绑定不可复制误差的shared_ptr <tcp::socket>

boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service)); 

boost::bind(&function, *socket); // compiler error: noncopyable error 
function(*socket); // this works fine 

void 
function(tcp::socket & socket) 
{ 
    //do work 
} 

为什么我得到了错误,所以使用boost ::绑定?

后来我尝试了以下内容:

boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service)); 
boost::bind(&function, socket); //this works fine now 
void function(boost::shared_ptr<tcp::socket> socket) 
{ 
    asio::read_until(&socket, buffer, "end"); // compiler error: says i am passing an invalid argument 
} 

为什么现在不工作的呢?

我知道我缺乏C/C++编程的基本知识。

如果任何人都可以包含一个可以帮助解决这类问题的链接,那就太好了。

回答

3

TCP ::插座是不可复制的,你需要把它作为一个参考:

boost::bind(&function, boost::ref(*socket)); 

你应该可能会坚持你的第二个版本,因为你不必担心socket对象的生命周期。

boost::bind(&function, socket); 
void function(boost::shared_ptr<tcp::socket> socket) 
{ 
    asio::read_until(*socket, buffer, "end"); 
} 
+0

第二种方法的问题是我无法读取套接字,因为它现在是一个指针。我以为我用&socket_ptr,会给我的套接字,而不是指针。你知道如何去做? – Takashi

+0

您使用get()来获取指针。但这不是你想要传递的,你想要传递一个对套接字的引用。看到我编辑的答案。 – ronag

4

您试图复制不可复制的对象。包装在一个boost ::参考对象来保存它作为参考:

boost::bind(&function, boost::ref(*socket)); 
相关问题