2011-11-17 76 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)); 
相關問題