2012-06-12 50 views
0

我通過這個升壓教程http://gwenael-dunand.developpez.com/tutoriels/cpp/boost/asio/去,這是給我的錯誤的負載上的boost ::綁定錯誤,同時使用ASIO與accepter.async_accept

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

我使用它在這裏

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

我得到這個巨大的錯誤此行的prsence

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 
[email protected]:~/Development/asio/build$ 

回答

2

似乎是在臨屋的錯誤t教程。參數new_connection是以參考的方式取得的,所以綁定需要使用boost::ref,否則它會嘗試複製它,並且錯誤顯示類型爲不可複製。將您的綁定更改爲:

boost::bind(
    &tcp_server::handle_accept 
    , this 
    , boost::ref(new_connection) // << pass by reference 
    , boost::asio::placeholders::error); 
+0

謝謝。但是當你將一個對象直接傳遞給一個引用它的函數時,它就起作用了。但爲什麼它不在這種情況下?就像一個函數可能需要'const string&'一樣,但是你可以將'string'傳遞給它。在這種情況下,你不需要'boost :: ref'。爲什麼在這裏? –

+0

@Dipro Sen:它實際上並不奏效,你會得到一個參數副本的參考。在這種情況下它不起作用,因爲類型是_noncopyable_,可能是爲了避免錯誤,比如你的。 –

+0

@Dipro Sen:如果一個函數需要'const string&'並且你傳遞了'string',那麼你會得到一個對副本的const引用。如果你想傳遞對象本身,你可以使用'boost :: cref'。深入研究一下_bind_文檔,將會清楚發生了什麼。 –

相關問題