boost :: bind与boost :: asio一起使用。 boost :: bind跟进

时间:2012-09-11 10:13:16

标签: c++ boost boost-asio boost-bind

现在我想在前一个问题的函数中添加两个参数:boost::bind together with boost::asio. boost::bind not working, copied from an example

编辑:抱歉,忘了添加timer_result的类型:boost :: optional timer_result;

//my function
void CClient::setResult2(boost::optional<boost::system::error_code>* a, boost::system::error_code b,
const boost::system::error_code& error, std::size_t);

//my attempt: I'd like to set the value of the first, third and fourth parameters but not the second one
timer.async_wait(boost::bind(&CClient::setResult2, this, &timer_result, _1,boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred));

_1是否意味着与上一个问题有所不同?感谢。

错误:

Description     Resource        Path    Location        Type  
required from ‘void boost::asio::basic_deadline_timer<Time,
TimeTraits, TimerService>::async_wait(WaitHandler&&) [with WaitHandler
= boost::_bi::bind_t<void, boost::_mfi::mf4<void, CClient, boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >; Time =
boost::posix_time::ptime; TimeTraits =
boost::asio::time_traits<boost::posix_time::ptime>; TimerService =
boost::asio::deadline_timer_service<boost::posix_time::ptime,
boost::asio::time_traits<boost::posix_time::ptime> >]’   remote_server
line 501, external location:
/usr/include/boost/asio/basic_deadline_timer.hpp   C/C++ Problem
invalid user-defined conversion from ‘const boost::system::error_code’
to ‘unsigned int’ [-fpermissive] remote_server           line 525,
external location: /usr/include/boost/bind/bind.hpp   C/C++ Problem  
required from ‘void boost::_bi::list5<A1, A2, A3, A4,
A5>::operator()(boost::_bi::type<void>, F&, A&, int) [with F =
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>; A = boost::_bi::list1<const boost::system::error_code&>; A1 =
boost::_bi::value<CClient*>; A2 =
boost::_bi::value<boost::optional<boost::system::error_code>*>; A3 =
boost::arg<1>; A4 = boost::arg<1> (*)(); A5 = boost::arg<2> (*)()]’   
remote_server           line 525, external location:
/usr/include/boost/bind/bind.hpp   C/C++ Problem size of array is
negative       remote_server           line 37, external location:
/usr/include/boost/bind/arg.hpp     C/C++ Problem make: ***
[src/CClient.o] Error 1       remote_server                   C/C++
Problem   required from ‘void boost::asio::detail::binder1<Handler,
Arg1>::operator()() [with Handler = boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >; Arg1 =
boost::system::error_code]’     remote_server           line 46,
external location: /usr/include/boost/asio/detail/bind_handler.hpp    
C/C++ Problem   required from ‘boost::_bi::bind_t<R, F,
L>::result_type boost::_bi::bind_t<R, F, L>::operator()(const A1&)
[with A1 = boost::system::error_code; R = void; F =
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>; L = boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()>;
boost::_bi::bind_t<R, F, L>::result_type = void]’    remote_server    
line 47, external location: /usr/include/boost/bind/bind_template.hpp 
C/C++ Problem   required from ‘void
boost_asio_handler_invoke_helpers::invoke(Function&, Context&) [with
Function = boost::asio::detail::binder1<boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >,
boost::system::error_code>; Context = boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >]’
remote_server           line 39, external location:
/usr/include/boost/asio/detail/handler_invoke_helpers.hpp   C/C++
Problem   required from ‘void
boost::asio::asio_handler_invoke(Function, ...) [with Function =
boost::asio::detail::binder1<boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >,
boost::system::error_code>]’       remote_server           line 64,
external location: /usr/include/boost/asio/handler_invoke_hook.hpp    
C/C++ Problem   required from
‘boost::asio::detail::wait_handler<Handler>::wait_handler(Handler&)
[with Handler = boost::_bi::bind_t<void, boost::_mfi::mf4<void,
CClient, boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >]’  
remote_server           line 39, external location:
/usr/include/boost/asio/detail/wait_handler.hpp     C/C++ Problem  
required from ‘static void
boost::asio::detail::wait_handler<Handler>::do_complete(boost::asio::detail::io_service_impl*,
boost::asio::detail::operation*, const boost::system::error_code&,
std::size_t) [with Handler = boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >;
boost::asio::detail::io_service_impl =
boost::asio::detail::task_io_service; boost::asio::detail::operation =
boost::asio::detail::task_io_service_operation; std::size_t = unsigned
int]’ remote_server           line 69, external location:
/usr/include/boost/asio/detail/wait_handler.hpp     C/C++ Problem
make: *** No rule to make target `all'.                         C/C++
Problem   required from ‘void
boost::asio::deadline_timer_service<TimeType,
TimeTraits>::async_wait(boost::asio::deadline_timer_service<TimeType,
TimeTraits>::implementation_type&, WaitHandler&&) [with WaitHandler =
boost::_bi::bind_t<void, boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >; TimeType =
boost::posix_time::ptime; TimeTraits =
boost::asio::time_traits<boost::posix_time::ptime>;
boost::asio::deadline_timer_service<TimeType,
TimeTraits>::implementation_type =
boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime>
>::implementation_type]’ remote_server           line 138, external location: /usr/include/boost/asio/deadline_timer_service.hpp C/C++
Problem   required from ‘void
boost::asio::detail::deadline_timer_service<Time_Traits>::async_wait(boost::asio::detail::deadline_timer_service<Time_Traits>::implementation_type&,
Handler) [with Handler = boost::_bi::bind_t<void,
boost::_mfi::mf4<void, CClient,
boost::optional<boost::system::error_code>*,
boost::system::error_code, const boost::system::error_code&, unsigned
int>, boost::_bi::list5<boost::_bi::value<CClient*>,
boost::_bi::value<boost::optional<boost::system::error_code>*>,
boost::arg<1>, boost::arg<1> (*)(), boost::arg<2> (*)()> >;
Time_Traits = boost::asio::time_traits<boost::posix_time::ptime>]’
remote_server           line 180, external location:
/usr/include/boost/asio/detail/deadline_timer_service.hpp  C/C++
Problem   required from here    CClient.cpp     /remote_server/src    
line 102        C/C++ Problem

的相关信息:

Description     Resource        Path    Location        Type candidate is: 
boost::system::error_code::operator boost::system::error_code::unspecified_bool_type() const <near match>
remote_server           line 355, external location:
/usr/include/boost/system/error_code.hpp   C/C++ Problem   no known conversion for implicit ‘this’ parameter from ‘boost::system::error_code::unspecified_bool_type {aka void (*)()}’ to ‘unsigned int’      remote_server           line 355, external
location: /usr/include/boost/system/error_code.hpp   C/C++ Problem

3 个答案:

答案 0 :(得分:0)

您的方法中有两个错误代码,并且绑定中只有一个错误占位符。

答案 1 :(得分:0)

placeholders::error_1的别名,而placeholders::bytes_transferred实际上是_2,因此您无法再次_1

将您的附加参数移至第三个:void CClient::setResult2(const boost::system::error_code& error, std::size_t, boost::optional<boost::system::error_code>* a)并将&timer_result作为第三个参数传递。像这样:

bind(&CClient::setResult2, this, _1, _2, &timer_result)

(我在这里使用了短占位符,但是你可以用更长的asio代替它们,如果你喜欢的话。)

答案 2 :(得分:0)

async_wait()接受带有此签名的函数(来自Boost.ASIO文档):

void handler(
  const boost::system::error_code& error // Result of operation.
);

你的绑定会产生一个功能性的东西,其签名类似于:

void bound_setResult2(_1, _error, _bytes_transferred);

bind()调用中的每个占位符都映射到绑定结果中的参数。你有三个占位符。当然它不编译。但是你有一个更大的概念问题。

您似乎认为截止时间计时器知道正在进行的I / O.它不是。当计时器过去或被取消时,处理程序就会被调用。 (并且错误代码表示它是否被取消。)不应期望计时器处理程序知道传输的#bytes。由您的I / O处理程序(而不是计时器过期的处理程序)来跟踪该信息。

可能你在计时器处理程序中真正想要的只是调用port.cancel()然后在setResults2()中的代码 - 它应该是I / O的处理程序,而不是计时器 - 你处理取消。