0

I am going through this boost tutorial on http://gwenael-dunand.developpez.com/tutoriels/cpp/boost/asio/ and It is giving me loads of error on

boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error);

I am using it here

m_acceptor.async_accept(new_connection.socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error));

I am getting this huge error for prsence of this line

In file included from /usr/include/boost/asio/basic_socket.hpp:24,                                                                                                                                                              
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:25,
                 from /usr/include/boost/asio.hpp:20,
                 from /home/dipro/Development/asio/main.cpp:5:
/usr/include/boost/noncopyable.hpp: In copy constructor ‘boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_io_object(const boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’:
/usr/include/boost/noncopyable.hpp:27: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private
/usr/include/boost/asio/basic_io_object.hpp:30: error: within this context
In file included from /usr/include/boost/asio/datagram_socket_service.hpp:33,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:26,
                 from /usr/include/boost/asio.hpp:20,
                 from /home/dipro/Development/asio/main.cpp:5:
/usr/include/boost/noncopyable.hpp: In copy constructor ‘boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp, boost::asio::detail::epoll_reactor<false> >::implementation_type::implementation_type(const boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp, boost::asio::detail::epoll_reactor<false> >::implementation_type&)’:
/usr/include/boost/noncopyable.hpp:27: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private
/usr/include/boost/asio/detail/reactive_socket_service.hpp:58: error: within this context
In file included from /usr/include/boost/asio/basic_socket.hpp:24,
                 from /usr/include/boost/asio/basic_datagram_socket.hpp:25,
                 from /usr/include/boost/asio.hpp:20,
                 from /home/dipro/Development/asio/main.cpp:5:
/usr/include/boost/asio/basic_io_object.hpp: In copy constructor ‘boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_io_object(const boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’:
/usr/include/boost/asio/basic_io_object.hpp:30: note: synthesized method ‘boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp, boost::asio::detail::epoll_reactor<false> >::implementation_type::implementation_type(const boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp, boost::asio::detail::epoll_reactor<false> >::implementation_type&)’ first required here 
In file included from /usr/include/boost/asio/basic_datagram_socket.hpp:25,
                 from /usr/include/boost/asio.hpp:20,
                 from /home/dipro/Development/asio/main.cpp:5:
/usr/include/boost/asio/basic_socket.hpp: In copy constructor ‘boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_socket(const boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’:
/usr/include/boost/asio/basic_socket.hpp:45: note: synthesized method ‘boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_io_object(const boost::asio::basic_io_object<boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’ first required here 
In file included from /usr/include/boost/asio.hpp:28,
                 from /home/dipro/Development/asio/main.cpp:5:
/usr/include/boost/asio/basic_stream_socket.hpp: In copy constructor ‘boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_stream_socket(const boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’:
/usr/include/boost/asio/basic_stream_socket.hpp:49: note: synthesized method ‘boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_socket(const boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’ first required here 
/home/dipro/Development/asio/main.cpp: In copy constructor ‘tcp_connection::tcp_connection(const tcp_connection&)’:
/home/dipro/Development/asio/main.cpp:9: note: synthesized method ‘boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::basic_stream_socket(const boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&)’ first required here 
/home/dipro/Development/asio/main.cpp: In member function ‘void tcp_server::start_accept()’:
/home/dipro/Development/asio/main.cpp:39: note: synthesized method ‘tcp_connection::tcp_connection(const tcp_connection&)’ first required here 
/home/dipro/Development/asio/main.cpp:39: error:   initializing argument 3 of ‘boost::_bi::bind_t<R, boost::_mfi::mf2<R, T, A1, A2>, typename boost::_bi::list_av_3<A1, A2, A3>::type> boost::bind(R (T::*)(B1, B2), A1, A2, A3) [with R = void, T = tcp_server, B1 = tcp_connection&, B2 = const boost::system::error_code&, A1 = tcp_server*, A2 = tcp_connection, A3 = boost::arg<1> (*)()]’
make[2]: *** [CMakeFiles/asio.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/asio.dir/all] Error 2
make: *** [all] Error 2
dipro@bong:~/Development/asio/build$ 
Dipro Sen
  • 4,350
  • 13
  • 37
  • 50

1 Answers1

2

There seems to be an error on that tutorial. The argument new_connection is taken by reference so the bind needs to use boost::ref, otherwise it will try to copy it and as the error shows the type is noncopyable. Change your bind to:

boost::bind(
    &tcp_server::handle_accept
  , this
  , boost::ref(new_connection) // << pass by reference
  , boost::asio::placeholders::error);
K-ballo
  • 80,396
  • 20
  • 159
  • 169
  • Thanks. But When you pass an object directly to a function that takes by reference it works. But why it doesn't in this case ? just as a function may take `const string&` but you can pass `string` to it. you don't need a `boost::ref` in that case. for why here ? – Dipro Sen Jun 12 '12 at 19:02
  • @Dipro Sen: It doesn't really work, you get a reference to a copy of the argument. It doesn't work in this case because the type is _noncopyable_, probably made so to avoid errors such as yours. – K-ballo Jun 12 '12 at 19:03
  • @Dipro Sen: If a function takes `const string&` and you pass `string`, then you'll get a const reference to a copy. If you want to pass the object itself you would use `boost::cref`. Take a deeper look at _bind_ documentation and it will became clear what's going on. – K-ballo Jun 12 '12 at 19:04
  • really ? I didn't know that. Then why would I use `string&` if it still copies ? – Dipro Sen Jun 12 '12 at 19:05
  • @Dipro Sen: Regular functions don't do copies then; its only `bind` that does since it takes its arguments by value. The now standard `boost::ref` and `boost::cref` wrap a reference so that it can be passed around by value. – K-ballo Jun 12 '12 at 19:07
  • O! Now I understand. `boost::bind` copies the values to put them in `ftor`. So I need a `boost::ref` so that it copies the `reference` instead Thanks – Dipro Sen Jun 12 '12 at 19:09