2016-11-11 130 views
1

我有一个使用对象的日期字段来确定地图顺序的地图。为此,我使用lambda表达式来处理比较。这工作正常,但我得到一个警告说warning: ‘Foo’ has a field ‘Foo::m_date_map’ whose type uses the anonymous namespace这个问题似乎是在我的别名的事实。我在一个答案中看到,解决方法是命名匿名类型,但我不知道该怎么做。在地图中使用lambda作为比较器时的匿名类型警告

//In Foo.h 

static constexpr auto compare_by_date = [](const date_key* lhs, const date_key* rhs) { 
    return std::tie(lhs->year, lhs->month, lhs->day) < std::tie(rhs->year, rhs->month, rhs->day); 
}; 

class Foo { 
    using ValueMap = std::map<double, date_key* const>; 
    using DateMap = std::map<date_key* const, ValueMap *, decltype(compare_by_date)>; 

    DateMap * m_date_map; 

    Foo(); 

} 

//In Foo.cpp 
Foo::Foo() : m_date_map(new DateMap(compare_by_date) { 
    // Do something 
} 

我应该如何去摆脱警告?

回答

1

我认为将lambda转换为std::function会起作用。

static constexpr std::function<bool(const date_key*, const date_key*)> compare_by_date = ... 
+0

这摆脱了警告,但有趣的是,声明不再是一个constexpr,因为变量'不是字面的,因为它有一个非平凡的析构函数'。我不确定我完全掌握了这个错误,但是失去了constexpr的帮助。 – jterm