Теперь я хотел бы добавить два параметра к функции предыдущего вопроса: boost :: bind вместе с boost :: asio. boost :: bind не работает, скопировано с примера
РЕДАКТИРОВАТЬ: Извините, забыл добавить тип timer_result: boost :: необязательный 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
У вас есть два кода ошибки в вашем методе и только один заполнитель ошибок внутри bind.
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, если они вам нравятся.)
async_wait()
принимает функцию с этой подписью (из документации Boost.ASIO):
void handler(
const boost::system::error_code& error // Result of operation.
);
Ваша привязка приводит к функциональности с подписью, напоминающей:
void bound_setResult2(_1, _error, _bytes_transferred);
Каждый заполнитель в вызове bind () сопоставляется с параметром в результате привязки. У вас есть три заполнителя. Конечно, это не компилируется. Но у вас есть большая, концептуальная проблема.
Вы, кажется, думаете, что таймер крайнего срока знает о происходящем вводе / выводе. Это не. Обработчик вызывается только по истечении или отмене таймера. (И код ошибки указывает, была ли она отменена.) Не следует ожидать, что обработчик таймера будет знать о переданных байтах #. Именно ваш обработчик ввода / вывода (не обработчик с истекшим таймером) должен отслеживать эту информацию.
Вероятно, все, что вам действительно нужно в обработчике таймера, это код, который вызывает port.cancel()
а затем, в setResults2()
— который должен быть обработчиком для ввода / вывода, а не для таймера — вы имеете дело с отменой.