Объявление лямбда — функции с помощью auto в классе C

#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 () никогда не работает при инициализации членов в области действия класса. Предположительно, потому, что компилятор не смог бы отделить его от объявлений функций-членов.