Boost :: associate method with boost :: function parameter

I would like to provide an additional boost :: function for async_write. I need to call my own HandleWrite function first, and then call the provided boost :: function.

Member method of Connection that communicates with asio async_write

void Connection::HandleWrite( const boost::system::error_code& e, boost::function<void (const boost::system::error_code&)> handler) { // Code removed for clarity if(!handler.empty()) handler(e); }; 

Trying to bind HandleWrite to asinoc_write asio and provide another binding as a value for the handler. This does not compile. What am I doing wrong?

  void Connection::QueueRequest( boost::shared_array<char> message, std::size_t size, boost::function<void (const boost::system::error_code&)> handler) { // Code hidden for clarity boost::asio::async_write(m_Socket, boost::asio::buffer(buffer), boost::bind(&Connection::HandleWrite, shared_from_this(), boost::asio::placeholders::error, handler ) ); } 

The error message I get from the compiler is the following:

 Error 1 error C2825: 'F': must be a class or namespace when followed by '::' boost\bind\bind.hpp 69 Error 2 error C2039: 'result_type' : is not a member of '`global namespace'' boost\bind\bind.hpp 69 Error 3 error C2146: syntax error : missing ';' before identifier 'type' boost\bind\bind.hpp 69 Error 4 error C2208: 'boost::_bi::type' : no members defined using this type boost\bind\bind.hpp 69 Error 5 fatal error C1903: unable to recover from previous error(s); stopping compilation boost\bind\bind.hpp 69 
+4
source share
2 answers

The problem ended up in a different place that used the same HandleWrite function and was not properly connected. After it is compiled.

0
source

What error do you get exactly? I don't see anything obvious in the code indicated in your question, so I cannot give you a direct answer.

However, Cornell’s answer questioned me because I thought that functors created by boost :: bind could take any number of arguments and simply ignore the extra ones.

So, I quickly hacked this to check:

 #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/function.hpp> #include <string> #include <iostream> void Foo(const boost::system::error_code&) { // whatever } struct Client : boost::enable_shared_from_this<Client> { void HandleWrite( const boost::system::error_code& Err, boost::function<void(const boost::system::error_code&)> OtherHandler ) { std::cout << "MyHandler(" << Err << ")\n"; OtherHandler(Err); } void MakeTheCall(boost::function<void (const boost::system::error_code&)> Other) { using boost::asio::ip::tcp; // Of course, the scope and initialization of // io_service, sock and request are all wrong here, // as we're only interested in testing if the async_write // call below will compile. // Don't try to run this at home! boost::asio::io_service io_service; tcp::socket sock(io_service); boost::asio::streambuf request; boost::asio::async_write(sock, request, boost::bind(&Client::HandleWrite, shared_from_this(), boost::asio::placeholders::error, Other ) ); } }; int main() { boost::shared_ptr<Client> c; c->MakeTheCall(boost::bind(&Foo, _1)); return 0; } 

which draws what I think you are trying to do.

As expected, it compiles, so comparing it with what you are actually doing can help you find the problem.

0
source

Source: https://habr.com/ru/post/1299654/


All Articles