#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. Рад, что смог помочь! Дайте мне знать, если есть какие-либо другие проблемы