Ошибка неопубликованного Boost :: Bind с shared_ptr <tcp :: socket> - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь сделать следующее:

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 ]

4 голосов
/ 17 ноября 2011

Вы пытаетесь скопировать некопируемый объект.Оберните его в объект boost :: ref, чтобы сохранить его как ссылку:

boost::bind(&function, boost::ref(*socket));
3 голосов
/ 17 ноября 2011

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");
}
...