[英]std::packaged_task compile error w/ gcc 4.6
我正在嘗試使用std::packaged_task
在線std::packaged_task
一個函數
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:再次更新代碼以修復錯誤並包含完整的錯誤消息。
g ++ - 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的新手 - 什么是一個好的工作替代品? 我只需要啟動一個給我未來的線程,稍后在boost::asio
異步循環中調用get()
-method。
這是GCC 4.6中的一個錯誤(實際上是C ++ 11標准中的一個缺陷 ),我已經在4.7中修復了它。
作為一種解決方法,您可以使用std::async
Query query;
std::future<SearchResults> ftr = std::async([](Query& q) ->SearchResults {
index::core::Merger merger;
return merger.search(q);
}, query);
這適用於GCC 4.6,並且創建一個packaged_task
並在分離的線程中運行它更簡單,更安全。
我不知道這些是否是GCC給出的錯誤的原因,但它們仍然存在問題。
[=](Query& q){
index::core::Merger merger;
return merger.search(q);
}
由於此lambda不包含單個return語句,並且未給出顯式返回類型,因此它具有void
返回類型。 我懷疑你打算它返回一個SearchResults
對象。 它需要一個Query&
參數,因此打包任務的相應簽名將是SearchResults(Query&)
。
[=](Query& q) -> SearchResults {
index::core::Merger merger;
return merger.search(q);
}
更新的代碼有兩個問題:
1)lambda沒有正確地說明它的返回類型。 您想要的語法是(假設您不需要復制任何局部變量):
[](Query& q) -> SearchResults {
index::core::Merger merger;
return merger.search(q);
}
2)鑒於打包的任務需要Query&
,那么您需要將對非常量Query的引用作為std::thread
構造函數的第二個參數傳遞,以便將其傳遞給任務。
我不記得的是,如果你可以合法地將非常量Query引用作為第二個參數傳遞給std::thread
,或者如果你需要使用std::ref(q)
以便它正確傳遞第二個參數參考的論點。
如上所述,它試圖在沒有參數的情況下調用任務,如下所示
/usr/include/c++/4.6/future:1272:7:注意:候選人需要1個參數,0提供
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.