#c #class #auto
Вопрос:
Можно ли объявить лямбда-функцию в классе C с auto
помощью ? Я получаю ошибку компиляции:
ошибка: инициализатор в классе для элемента статических данных типа » const Temp::(лямбда в.cpp:8:29)» требует спецификатора «constexpr»
Я определяю пользовательскую функцию сортировки для набора, который является переменной-членом класса, и я хочу определить эту функцию сортировки в классе. Как я могу это исправить?
Во-вторых, даже если я перемещаю строку лямбда-функции за пределы класса, я получаю ошибку в строке, где я объявляю набор:
ошибка: неизвестное имя типа «cmp»
Почему и как я могу это исправить?
class Temp { public: static const auto cmp = [](int p1, int p2) { return p1gt;p2; }; setlt;int, decltype(cmp) gt; sortedSet(cmp); Temp() { } }
Комментарии:
1. Полу-связанный: Почему вы хотите использовать здесь лямбда-выражение? Обычную функцию было бы намного проще написать (и к тому же короче).
2. как насчет использования спецификатора ‘constexpr’ , как он предлагает?
3. @appleapple, это тоже не работает. Это выдает ошибку: неизвестное имя типа «cmp»
4.
sortedSet(cmp)
также должно бытьsortedSet{cmp}
5. @UnholySheep Это была еще одна проблема. Теперь это работает.
Ответ №1:
- используйте
constexpr
как, как предлагает компилятор std::setlt;int, decltype(cmp)gt; sortedSet(cmp)
является ли синтаксический анализ функцией- Нравится
int sortedSet(int);
- Нравится
#include lt;setgt; class Temp { public: static constexpr auto cmp = [](int p1, int p2) // lt;-- use constexpr { return p1gt;p2; }; std::setlt;int, decltype(cmp) gt; sortedSet{cmp}; // lt;-- use uniform initialization Temp() { } };
в качестве альтернативы вы также можете сделать это с помощью обычной функции
#include lt;setgt; class Temp { public: static bool cmp(int p1, int p2) { return p1gt;p2; }; std::setlt;int, decltype(amp;cmp) gt; sortedSet{cmp}; Temp() { } };
Комментарии:
1. Спасибо. Я попытался это сделать, но получил ошибку: неизвестное имя типа «cmp» . Проблема заключалась в выполнении SortedSet(cmp) вместо SortedSet{cmp}.
2. @apple apple, почему SortedSet(cmp) работает в обычных случаях, но не здесь. Почему вместо () следует использовать {}?
3. @flexter
()
никогда не работает при инициализации членов в области действия класса. Предположительно, потому, что компилятор не смог бы отделить его от объявлений функций-членов.