Я пытаюсь создать задачу с помощью упакованной задачи.
Я использую сопрограмму-член, в которой есть аргументы, в том числе члены типа string и общего указателя на класс.
Затем я помещу будущее задачи в контейнер, который будет использоваться с wait_for_any.
и затем я отправляю задачу в asio ioservice.
это прототип сопрограммы:
std::string Execute(boost::asio::yield_context, std::string, std::map<std::string, boost::shared_ptr<HTTPResponse>>&);
и вот как я пишу упакованную задачу, обратите внимание, что выполнение сопрограммы является членом другой класс, экземпляр которого сохраняется с помощью shared_pointer в карте, и здесь я разыменую этот общий указатель карты, чтобы получить указатель на экземпляр «вместо указателя» this «требуется для функции-члена»:
boost::packaged_task<std::string(boost::asio::yield_context, std::string, std::map<std::string, boost::shared_ptr<HTTPResponse>>&)> task(boost::bind(&HTTPRequest::Execute, mClientRequestsVariables[m_HttpClient_request_name].get(),boost::placeholders::_1, m_HttpClient_request_name, Get_mHTTPClient_Responses_Map()));
, и это как я пишу остальное:
boost::future<std::string> fut = (task.get_future());
mPendingData.push_back(std::move(fut)); // C++11 possible: (std::move(fut) when fut is a unique_future);
mIos.post(std::move(task));
это дает мне следующую ошибку:
Error C2280 'boost::packaged_task<std::string (boost::asio::yield_context,std::string,std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &)>::packaged_task(const boost::packaged_task<std::string (boost::asio::yield_context,std::string,std::map<_Kty,_Ty,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> &)> &)': attempting to reference a deleted function
Error C2338 CompletionHandler type requirements not met
Error C2064 term does not evaluate to a function taking 0 arguments
что я могу сделать ??
обновление:
Я прочитал некоторые ответы о packaged_task и попытался изменить код на:
typedef boost::packaged_task<std::string(boost::asio::yield_context, std::string, boost::shared_ptr<std::map<std::string, boost::shared_ptr<HTTPResponse>>>)> task_t;
//typedef boost::packaged_task<std::string()> task_t;
boost::shared_ptr<task_t> task = boost::make_shared<task_t>(boost::bind(&HTTPRequest::Execute, mClientRequestsVariables[m_HttpClient_request_name].get(), boost::placeholders::_1, m_HttpClient_request_name, Get_mHTTPClient_Responses_Map_shared_pointer()));
boost::future<std::string> fut = (task->get_future());
mPendingData.push_back(std::move(fut)); // C++11 possible: (std::move(fut) when fut is a unique_future);
и закомментировал эту строку:
//????????mIos.post(boost::bind(&task_t::operator(), task));
и код скомпилировано.
но когда я раскомментирую эту строку:
mIos.post(boost::bind(&task_t::operator(), task));
эта ошибка происходит:
Error C2440 'return': cannot convert from 'void (__cdecl &)(boost::asio::yield_context,std::string,boost::shared_ptr<std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>>)' to 'void (&)(boost::asio::yield_context,std::string,boost::shared_ptr<std::map<std::string,boost::shared_ptr<HTTPResponse>,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>>)'
в чем проблема с постом io_service ???