Сортировка вектора с помощью функции-члена const

#c

#c

Вопрос:

Я пытаюсь отсортировать вектор пользовательского класса с помощью лямбда-функции, но где-то я получаю отброшенный const , который я не понимаю.

Я уже пытался найти ответы здесь, и, хотя многие люди задавали почти один и тот же вопрос, ни один из них, похоже, не является одной и той же проблемой. Я не запрещаю конструктор перемещения и не вызываю неконстантную функцию-член / член в сортировке (по крайней мере, об этом я знаю. Очевидно, я делаю что-то не так.) Самое близкое, что я могу придумать, это то, что я возвращаю значение неконстантного члена, но я делаю это через функцию const , и я явно хочу это сделать. Я хочу, чтобы общедоступные функции-члены, которые ничего не могут изменить, с закрытыми элементами, которые могут быть изменены внутренне (но не какой-либо общедоступной функцией). Единственные действительно странные вещи, которые я делаю (которые, как я считаю, не оказывают на это никакого влияния), это то, что мой класс не копируется и имеет не копируемый член (перемещение в порядке).

 class MyClass{
 public:
  const SortByThis() { return internal_value; } //Edit: This declaration is the problem, as noted in the accepted answer.
  MyClass(SortByThis, BigNonCopyableDataStrcuture);
  MyClass(MyClassamp;)=delete; //No copy allowed. Only move.
 private:
  int internal_value;
  BigNonCopyableDataStructure_t big_structure;
}
std::vector<MyClass> vec;
DoFillVec(vec); //Vec now has many items but is not sorted

std::sort(vec.begin(), vec.end(), [](const MyClass amp;lhs, const MyClass amp;rhs){return lhs.SortByThis() < rhs.SortByThis();});
//This is where things scream at me.
//Project/Module.cc:226:95: error: passing ‘const Namespace::Module::MyClass’ as ‘this’ argument discards qualifiers [-fpermissive]

  

Я ожидаю, что это отсортирует вектор, но вместо этого компилятор жалуется, что я делаю что-то не так, и я не совсем понимаю, что я делаю не так. На данный момент я вынужден перебирать вещи, пока он не скомпилируется (и разве это не больное чувство).

Комментарии:

1. Я думаю, вы хотели сказать int SortByThis() const { return internal_value; } .

2.но где-то я получаю отброшенный const, который я не понимаю. const SortByThis(){ return internal_value; } необходимо int SortByThis() const { return internal_value; }

3. Спасибо вам обоим. Я действительно объявил постоянный возвращаемый тип вместо постоянной функции… Упс.

4. Почему вы вложили ответ в этот вопрос? Теперь, похоже, вы спросили: «Вот этот код, который не работает: <код, который работает следующим образом>. Почему это не работает? »

5. Хороший момент. Я верну его, чтобы он был более полезен для любых будущих пользователей Google с моей глупостью.

Ответ №1:

SortByThis неправильно объявлено. const Идет после функции, а не перед:

 int SortByThis() const { return internal_value; }
  

Дайте нам знать, если это решит проблему!

Комментарии:

1. Спасибо. Моя дислексия распространяется на мое программное обеспечение… Я потратил на это гораздо больше времени, чем следовало. Я обещаю, что понимаю разницу между постоянным типом возвращаемого значения и постоянной функцией (я просто продолжаю путать их использование)… Спасибо. Я приму ваш ответ, как только смогу (таймер на 5 минут).

2. Рад, что смог помочь! Дайте мне знать, если есть какие-либо другие проблемы