为什么我不能将lambda用作类中定义的集合的比较器?

时间:2014-09-17 04:37:48

标签: c++ c++11 lambda

这是相当标准的,工作正常:

#include <set>

auto cmp = [](int a, int b) { return a > b; };
using stype = std::set<int, decltype(cmp)>;

stype mySet(cmp);

但为什么我不这样做?

#include <set>

auto cmp = [](int a, int b) { return a > b; };
using stype = std::set<int, decltype(cmp)>;

struct foo {
    stype mySet(cmp);
};

这与Unknown type name 'cmp'失败(在XCode 5.1.1中,使用llvm为Mac编译,以防它相关。)

出现此错误的原因是什么,以及如何修复/解决此问题?为此我是否必须避免使用lambda,如果是,为什么?

我的实际代码有几个类,它们存储stype::iterator类型的对象以指向foo::mySet内的项目,所以我确实想在结构外部声明stype

1 个答案:

答案 0 :(得分:4)

非静态数据成员初始化程序必须是大括号或等于初始化程序。以下应该有效:

stype mySet {cmp};
stype mySet = stype(cmp);

但是,stype mySet(cmp);被解析为声明名为mySet的成员 function ,它返回stype并获取类型为cmp的未命名参数,因此错误。