Должен ли std :: bind быть совместим с boost :: asio? - PullRequest
43 голосов
/ 19 января 2012

Я пытаюсь адаптировать один из примеров boost :: asio для использования библиотек c ++ 11 / TR1, где это возможно. Исходный код выглядит так:

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      boost::bind(&tcp_server::handle_accept, this, new_connection,
         boost::asio::placeholders::error));
}

Если я заменю boost::bind на std::bind следующим образом:

void start_accept()
{ 
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      std::bind(&tcp_server::handle_accept, this, new_connection,
                 boost::asio::placeholders::error ) );
      // std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) );
}

Я получаю большое сообщение об ошибке, оканчивающееся на:

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'

Я использую gcc версии 4.4 с надстройкой версии 1.47

Я ожидал, что boost :: bind и std :: bind будут взаимозаменяемыми.

1 Ответ

26 голосов
/ 02 марта 2012

У меня теперь есть решение

Проблема в том, что когда я впервые попытался переключиться на std::bind и std::shared_ptr Я все еще использовал boost::asio::placeholders с std::bind, это привело к большое количество ошибок компилятора шаблона, поэтому я попытался переключиться по частям.

Сначала я попытался переключить только boost::shared_ptr на std::shared_ptr, это не удалось, потому что boost::bind не будет работать с std::shared_ptr без специализации шаблона get_pointer<typename T> для std::shared_ptr (см .: Как разрешить конфликт между boost :: shared_ptr и использованием std :: shared_ptr? ).

После переключения на std :: shared_ptr я затем переключился на std::bind, на этот раз используя std::placeholders, (спасибо Ричарду), пример кода теперь компилируется и работает правильно.

Чтобы использовать std::bind с boost::asio, убедитесь, что std::shared_ptr и std::placeholders также используются.

...