Ошибка при использовании boost :: signal2 :: signal в качестве обработчика - PullRequest
0 голосов
/ 01 марта 2011

В следующем коде:

   boost::signals2::signal<void(const boost::system::error_code&)> signal;
   socket.async_connect(endpoint, boost::ref(signal));

(найдено на http://liveworkspace.org/code/e04910cbcc4cfd9e42e34d1af55c393e)

Я получаю эту ошибку:

В файле, включенном в boost / asio / detail / wrapped_handler.hpp: 18: 0, из boost / asio / io_service.hpp: 24, из boost / asio / basic_io_object.hpp: 20, из boost / asio / basic_socket.hpp: 19, из boost / asio / basic_datagram_socket.hpp: 20, из boost / asio.hpp: 20, из source.cpp: 2: boost / asio / detail / bind_handler.hpp: в функции-члене 'void boost :: asio :: detail :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code :: оператор () () ': boost / asio / handler_invoke_hook.hpp: 64: 3: создается из 'void boost :: asio :: asio_handler_invoke ( повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code ... )» boost / asio / detail / handler_invoke_helpers.hpp: 39: 3: создается из 'void boost_asio_handler_invoke_helpers :: Invoke ( const boost :: asio :: detail :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code &, boost :: reference_wrapper> & )» boost / asio / detail / bind_handler.hpp: 73: 3: создается из 'void boost :: asio :: detail :: asio_handler_invoke ( const boost :: asio :: detail :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code &, повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code * )» boost / asio / detail / handler_invoke_helpers.hpp: 39: 3: создается из 'void boost_asio_handler_invoke_helpers :: Invoke ( const boost :: asio :: detail :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code &, повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: системы :: error_code & )» boost / asio / detail / extension_handler.hpp: 63: 7: создается из статического void boost :: asio :: detail :: completion_handler < повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: Система :: error_code

:: do_complete ( boost :: asio :: detail :: boost :: asio :: detail :: task_io_service *, boost :: asio :: detail :: boost :: asio :: detail :: task_io_service_operation *, boost :: system :: error_code, беззнаковый int )» boost / asio / detail / extension_handler.hpp: 38: 17: создается из 'boost :: asio :: detail :: completion_handler < повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: Система :: error_code

:: completion_handler ( повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: Система :: error_code

)» boost / asio / detail / impl / task_io_service.hpp: 50: 3: создается из 'void boost :: asio :: detail :: task_io_service :: пост ( повышение :: ASIO :: подробнее :: binder1 < boost :: reference_wrapper>, повышение :: Система :: error_code

)» boost / asio / impl / io_service.hpp: 80: 3: создается из 'void boost :: asio :: io_service :: post (Handler)' boost / asio / basic_socket.hpp: 649: 9: создается из 'void boost :: asio :: basic_socket < boost :: asio :: ip :: tcp, boost :: asio :: stream_socket_service :: async_connect ( boost :: asio :: basic_socket> :: boost :: asio :: ip :: basic_endpoint &, повышение :: reference_wrapper> )» source.cpp: 10: 53: создается отсюда boost / asio / detail / bind_handler.hpp: 40: 5: ошибка: нет совпадения для вызова '( повышение :: reference_wrapper> ) (const boost :: system :: error_code &) '

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

Похоже, ваша подпись неверна? Вам необходимо указать местозаполнитель для кода ошибки

Попробуйте

boost::signals2::signal<void(const boost::system::error_code&)> signal;
socket.async_connect(endpoint, boost::bind(boost::ref(signal), _1));
1 голос
/ 02 марта 2011

Ответ Ральфа близок, я думаю, вам нужно связать заполнитель с функтором signal:

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

using namespace boost::asio;

int 
main() 
{
   io_service ios;
   ip::tcp::socket socket(ios);
   const ip::tcp::endpoint endpoint(
           ip::address::from_string(""), 
           0
           );

   boost::signals2::signal<void(const boost::system::error_code&)> signal;
   socket.async_connect(
           endpoint, 
           boost::bind(
               boost::ref(signal), _1
               ) 
       );
}

пример:

samm@macmini ~$ g++ -I /opt/local/include -L/opt/local/lib -Wl,-rpath,/opt/local/lib -lboost_system signal.cc 
samm@macmini ~$ echo $?
0
samm@macmini ~$ 
...