2013-10-07 81 views
0

嘗試創建API時,我遇到了MiniGW的問題。這在MSVC11(Visual Studio 2012 C++編譯器)中正常工作。我的編譯器(我相信)設置正確QMAKE_CXXFLAGS += -std=c++0x,畢竟我有一個lambda錯誤消息。將lambda轉換爲std :: function時出現問題

對於一些更多的解釋:

typedef std::function<bool(Item)> WHERE;//I was attempting to provide an explicit cast, 'auto' works fine in MSVS

Group where(WHERE func);//A simple "foreach boolean" search

在使用上述>

Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};

結果:

tst_groupstest.cpp:257: error: conversion from 'GroupsTest::groups()::__lambda1' to non-scalar type 'Groups::WHERE {aka std::function}' requested Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};

我希望這是明顯的東西,我只是找不到它。我計劃在這個項目中支持Linux和Mac,所以我很樂意早日推出這個項目。

這是我目前的解決方法,如果可能的話我寧願遠離這一點(畢竟,我在設計API時考慮到lambda表達式的原因是爲了具有明顯的簡潔代碼塊)。

本節編譯(所以不能用lambda表達式)

struct lambdaCueListstdFunc{ 
    bool operator()(Groups::Item x) 
    { 
     return x.has("NEW"); 
    } 
}; 

/** 
* Selects all cues for a particular list 
* @brief getCueList 
* @param list 
* @return a vector of all the cues for this list sorted by number. 
*/ 
std::vector<Groups::Item> CueService::getCueList(std::string list) 
{ 
    std::function<bool(Groups::Item)> where = lambdaCueListstdFunc(); 
// auto where = [&list] (Groups::Item & x) -> 
// { 
//  return x.get(la::cues::List) == list; 
// }; 
    std::vector<Groups::Item> result = cues()->where(where).sort(la::cues::NUMBER); 
    return result; 

} 

回答

5

std::function提供的函數簽名是從你想分配給它的拉姆達的不同。

typedef std::function<bool(Item)> WHERE; // <-- Takes argument by value 

Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");}; 
//       ^^^ 
// The lambda takes argument by reference 

更改其中一個以匹配另一個,具體取決於是否要通過值或引用傳遞。

+0

謝謝你救了我的努力搞懂這個問題好幾個小時。 –

0

這對我來說有一個不同的原因:通過lambda參數傳遞的值類型有一個類型爲std :: unique_ptr的成員,因此不可複製。

修復1:更改成員進行的std :: shared_ptr的

修復2:(常量)引用傳遞

相關問題