我在尝试创建API时遇到MiniGW问题。这在MSVC11(Visual Studio 2012 C ++编译器)中工作正常。我的编译器(我相信)已正确设置QMAKE_CXXFLAGS += -std=c++0x
,毕竟我有一个lambda错误消息。
有关更多解释:
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
使用上述&gt;
Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};
会产生:
tst_groupstest.cpp:257:错误:从'GroupsTest :: groups():: __ lambda1'转换为非标量类型'Groups :: WHERE {aka std :: function}'' Groups :: WHERE where = [](Item&amp; x) - &gt; bool {return x.has(“NEW”);};
我希望这是明显的,我找不到它。我打算通过这个项目来支持Linux和Mac,所以我很想早点解决这个问题。
这是我目前的解决方法,如果可能的话,我宁愿远离这个(毕竟,我设计它的原因是考虑到lambdas的API就是拥有明显的简洁代码块)。
此部分编译(不使用lambdas)
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;
}
答案 0 :(得分:5)
您提供给std::function
的函数签名与您尝试分配给它的lambda的函数签名不同。
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
根据您是想要传递值还是引用来更改任何一个以匹配另一个。
答案 1 :(得分:0)
由于不同的原因,我想到了这一点:通过lambda args传递的by-value类型有一个类型为std :: unique_ptr的成员,因此不可复制。
修复1:将成员更改为std :: shared_ptr
修复2:传递(const)引用