J’essaie d’adapter l’un des exemples boost :: asio pour utiliser les bibliothèques c ++ 11 / TR1 dans la mesure du possible. Le code d’origine ressemble à ceci:
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)); }
Si je remplace boost::bind
par std::bind
comme suit:
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 ) ); }
Je reçois un gros message d’erreur, avec des fins avec:
/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
J’utilise la version 4.4 de gcc avec boost version 1.47
Je m’attendais à ce que boost :: bind et std :: bind soient interchangeables.
J’ai maintenant une solution
Le problème est que lorsque j’ai essayé de passer à std::bind
et std::shared_ptr
j’utilisais toujours le boost::asio::placeholders
avec std::bind
, ce qui entraînait une grande quantité d’erreurs de compilation du modèle, donc J’ai ensuite essayé de changer de pièce.
J’ai d’abord essayé de changer simplement boost::shared_ptr
en std::shared_ptr
, ceci a échoué parce que boost::bind
ne fonctionnera pas avec std::shared_ptr
sans une spécialisation du modèle get_pointer
pour std::shared_ptr
(voir: Comment résoudre les conflits entre boost :: shared_ptr et utiliser std :: shared_ptr? ).
Après être passé à std :: shared_ptr, je suis ensuite passé à std::bind
, cette fois en utilisant std::placeholders
, (merci richard) l’exemple de code comstack maintenant et fonctionne correctement.
Pour utiliser std::bind
avec boost::asio
assurez-vous que std::shared_ptr
et std::placeholders
sont également utilisés.