Boost ::使用shared_ptr <tcp :: socket> </tcp :: socket>绑定不可复制的错误

时间:2011-11-17 19:28:33

标签: c++ boost boost-asio shared-ptr boost-bind

我正在尝试以下方法:

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 :: bind?

时出错

我后来尝试了以下内容:

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 ++编程的基本知识。

如果有人可以提供有助于解决此类问题的链接,那就太棒了。

2 个答案:

答案 0 :(得分:4)

您正在尝试复制不可复制的对象。将它包装在boost :: ref对象中以将其作为参考:

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

答案 1 :(得分:3)

tcp :: socket是不可复制的,您需要将其作为参考传递:

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

您可能应该坚持使用第二个版本,因为您不必担心套接字对象的生命周期。

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