2012-09-11 128 views
0

現在,我想兩個參數添加到前一個問題的功能:boost::bind together with boost::asio. boost::bind not working, copied from an exampleboost :: bind與boost :: asio一起使用。提高::綁定跟進

編輯:對不起,忘了補充timer_result類型:升壓::可選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 
+0

對不起khomyakoshka,我想我解開你的讚賞編輯... – deinocheirus

回答

0

您的方法二的錯誤代碼,只有一個內部綁定錯誤的佔位符。

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那些代替它們,如果你喜歡他們。)

+0

對不起。我應該如何timer.async_wait(boost :: bind(&CClient :: setResult2,this,&timer_result,_1,boost :: asio :: placeholders :: error, boost :: asio :: placeholders :: bytes_transferred)); 來電看看?我嘗試了幾件事,但沒有奏效。 – deinocheirus

+0

@ user1613我已經更新了我的答案,請再看一遍。順便說一下,我不太明白'boost :: system :: error_code b'是什麼。這似乎是多餘的,所以我忽略了它。 –

0

async_wait()接受功能與此簽名(從Boost.Asio的文檔):

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

你綁定導致功能十歲上下的事情與簽名類似:

void bound_setResult2(_1, _error, _bytes_transferred); 

在綁定每一個佔位符()調用映射到paramete r在綁定結果中。你有三個佔位符。當然它不會編譯。但是你有一個更大的概念問題。

您似乎認爲截止日期計時器知道正在進行的I/O。它不是。處理程序在計時器過去或被取消時才被調用。 (並且錯誤代碼指示它是否被取消。)不應期望定時器處理程序知道傳送的#字節。這取決於您的I/O處理程序(而不是定時器過期的處理程序)以跟蹤該信息。

也許,您真正想要的定時器處理程序中的代碼是調用port.cancel(),然後在setResults2() - 應該是I/O的處理程序,而不是定時器 - 您處理取消。

相關問題