这是相当标准的,工作正常:
#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
。
答案 0 :(得分:4)
非静态数据成员初始化程序必须是大括号或等于初始化程序。以下应该有效:
stype mySet {cmp};
stype mySet = stype(cmp);
但是,stype mySet(cmp);
被解析为声明名为mySet
的成员 function ,它返回stype
并获取类型为cmp
的未命名参数,因此错误。