簡體   English   中英

std :: packaged_task編譯錯誤w / gcc 4.6

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM