Я пытаюсь запустить функцию в потоке с помощью std::packaged_task
станд :: packaged_task ошибка компиляции ж/НКУ 4,6
Query query; /* protobuf object */
/* fill Query object */
std::packaged_task<SearchResults(Query&)> task([](Query& q) ->SearchResults {
index::core::Merger merger;
return merger.search(q);
});
std::future<SearchResults> ftr = task.get_future();
std::thread(std::move(task),query).detach();
Edit2: Обновлен код еще раз, чтобы исправить ошибки и включить полное сообщение об ошибке.
г ++ - 4,6 (на Ubuntu 10.04) не может скомпилировать код:
In file included from /usr/include/c++/4.6/memory:80:0,
from ../src/net/QueryConnection.cpp:8:
/usr/include/c++/4.6/functional: In instantiation of ‘std::_Bind_result<void,
std::packaged_task<SearchResults(Query&)>(Query)>’:
/usr/include/c++/4.6/thread:135:9: instantiated from ‘std::thread::thread(_Callable&&,
_Args&& ...) [with _Callable = std::packaged_task<SearchResults(Query&)>, _Args =
{Query&}]’
../src/net/QueryConnection.cpp:77:36: instantiated from here
/usr/include/c++/4.6/functional:1365:7: error: ‘std::_Bind_result<_Result,
_Functor(_Bound_args ...)>::_Bind_result(const std::_Bind_result<_Result,
_Functor(_Bound_args ...)>&) [with _Result = void, _Functor =
std::packaged_task<SearchResults(Query&)>, _Bound_args = {Query},
std::_Bind_result<_Result, _Functor(_Bound_args ...)> = std::_Bind_result<void,
std::packaged_task<SearchResults(Query&)>(Query)>]’ declared to take const reference,
but implicit declaration would take non-const
Build error occurred, build is stopped
Я читал, что это может быть из-за ошибки: gcc-mailinglist
Я новичок в C++/C++ 11 - Что было бы хорошей рабочей альтернативой? Мне просто нужно запустить поток, который дает мне будущее, которое get()
-method вызывается позже в асинхронном цикле boost::asio
.
Одна из проблем заключается в том, что вы объявили packaged_task как не принимать аргументы и возвращать SearchResults, но lambda принимает один аргумент. Я бы ожидал, что ваша декларация будет 'std :: packaged_task' –
Можете ли вы опубликовать полное сообщение об ошибке? Кажется, вы разместили только половину. Это делает его непонятным. –
Я изменил код, чтобы отразить отсутствующий аргумент, и добавил полное сообщение об ошибке с обновленным кодом. Все еще проблема. –