2016-11-11 3 views
1

マップの順序を決定するオブジェクトの日付フィールドを使用するマップがあります。これを行うために、ラムダ式を使用して比較を処理します。これはうまく動作しますが、私は警告を得るwarning: ‘Foo’ has a field ‘Foo::m_date_map’ whose type uses the anonymous namespace問題は私がエイリアス型であるという事実にあるようだ。私は1つの答えで、匿名型の名前を付けることが修正されているのを見ましたが、どうやってそれを行うのかはわかりません。ラムダをマップ内のコンパレータとして使用する場合の匿名型の警告

//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

ラムダをstd::functionに変換するとうまくいくと思います。

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

これは警告を取り除きますが、変数は「それが非自明なデストラクタを持っているので、リテラルではない」ので、興味深いことに文はもはやconstexprのになることはできません。私はエラーを完全に把握していないのですが、constexprを失うとそれがクリアされます。 – jterm

関連する問題