Musisz podać typ lambda jako argument szablonu, a nie samą lambdę. Co chcesz to:
auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);
Chociaż w rzeczywistości, ponieważ Twój lambda nie ma zrzuty, to może faktycznie być przechowywane w wskaźnik do funkcji, tak alternatywnie, można to zrobić:
std::map<int, int, bool(*)(const int&,const int&)>
test([](const int&a, const int& b) { return a < b; });
Choć Pierwszą o wiele bardziej czytelną. Chociaż korzystanie z funkcji wskaźnik typu jest bardziej wszechstronny. Oznacza to, że może przyjąć dowolny wskaźnik funkcji lub nie przechwytującą lambda, która pasuje do tego podpisu. Ale jeśli zmienisz swoją lambdę do przechwytywania, nie zadziała. Dla bardziej wszechstronny wersji, można użyć std::function
, tj:
std::map<int, int, std::function<bool(const int&, const int&)>>
który będzie działał z każdą funkcją, lambda (przechwytywanie lub nie) lub funkcja obiektu, o ile pasuje podpis.
Podałeś lambdę, tj. Obiekt; parametr szablonu musi być typem _, a nie instancją typu. – ildjarn
Zobacz [C++ priority_queue z błędem porównania lambda] (http://stackoverflow.com/questions/5807735/c-priority-queue-with-lambda-comparator-error) i [Czy "typ" wyrażenia lambda może być wyrażone?] (http://stackoverflow.com/questions/3867276/can-the-type-of-a-lambda-expression-be-expressed). –