2010-11-01 5 views
11

je reçois le message d'erreur suivant lorsque je suis en train d'utiliser std :: string avec boost :: asio :: tampon:Comment utiliser std :: string avec asio :: buffer()

boost /asio/detail/consuming_buffers.hpp: dans le constructeur « boost :: asio :: :: détails consuming_buffers < boost :: asio :: mutable_buffer, boost :: asio :: const_buffers_1

:: consuming_buffers (const boost :: asio :: const_buffers_1 &) ': boost/asio/impl/re ad.hpp: 140: 25:
instancié de « boost :: asio :: :: détail read_op < boost :: asio :: basic_stream_socket, boost :: asio :: const_buffers_1 , boost :: asio :: détail :: transfer_all_t , boost :: _ bi :: bind_t < vide, boost :: _ mfi :: MF1 , boost :: _ bi :: liste2, boost :: arg < 1> (*)()>

:: read_op ( boost :: asio :: basic_stream_socket &, const boost :: asio :: const_buffers_1 & , boost :: asio :: :: détail transfer_all_t , boost :: _ bi :: bind_t < vide, boost :: _ mfi :: MF1 , boost :: _ bi :: liste2, boost :: arg < 1> (*)()>

)' 
.... 
....... 

code source complet: http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86

+0

regarder ce si vous après 2 ans sont toujours curieux: http : // stackoverflow.com/questions/2790383/how-as-asynchronously-read-to-stdstring-using-boostasio – NoSenseEtAl

Répondre

10

Je pense que le problème est que vous passez un tampon const à async_read au lieu d'un tampon mutable. Dans le bloc se terminant par la ligne 50, boost::asio::buffer(_header) renvoie un tampon const. Vous devriez faire quelque chose comme boost::asio::async_read(s, boost::asio::buffer(data, size), handler), car boost::asio::buffer(data, size) crée un tampon mutable.

Au lieu d'utiliser std::string s pour _header et _data, vous avez probablement besoin d'utiliser les tableaux de CHAR, tels que:

char * _data;
boost :: asio :: buffer (_données, strlen (_données));

Voir les références pour buffer et async_read.

+2

Je suis sûr que std :: strings peut être assigné aux tableaux char *, et on peut exporter le tableau char * depuis le std :: string avec std :: string.c_str() –

+0

'std :: string :: c_str()' retourne 'const char *' pas 'char *'. Il ne peut être utilisé qu'avec 'const_buffer'. –

4

Vous devez passer un pointeur comme premier paramètre:

#include <string> 
#include <boost/asio.hpp> 

std::string request, reply; 
auto rsize = boost::asio::buffer(&reply[0], request.size()); 
+1

Comme une note, jusqu'à C++ 11, ce n'est pas nécessairement correct. Pre-C++ 11, le tableau char maintenu par std :: string n'était pas garanti contigu, ce qui est requis par boost :: asio :: buffer. En pratique, chaque compilateur utilise un bloc de mémoire contigu, ce qui est devenu un comportement requis dans C++ 11. –

Questions connexes