Сортирование list с пользовательским типом данных c++

Доброе утро, не получается отсортировать по убыванию.

class Student
{
public:
    string name;
    int age;
public:
    Student(string Name, int Age) { name = Name; age = Age; }
    Student() {};
    friend std::ostream& operator<< (std::ostream &out, const Student &point);
};

std::ostream& operator<< (std::ostream &out, const Student &point)
{
    out << point.name << ", " << to_string(point.age) << endl;
    return out;
}


void sort(vector<Student>  &v) {
    int k = v.size();
    Student temp;
    for (int i = 0; i < k; i++)
        for (int j = i + 1; j < k; j++)
            if (v[i] < v[j])
            {
                temp = v[i];
                v[i] = v[j];
                v[j] = temp;
            }
}



bool operator < (Student &a, Student &b)
{
    Student temp; Student temp2;
    if (temp.age < temp2.age) return temp.age;
    else return temp2.age;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    vector<Student> list;
    list.emplace_back("Иванов", 45);
    list.emplace_back("Петров", 30);
    list.emplace_back("Сидоров", 55);
    list.emplace_back("Коробков", 45);
    list.emplace_back("Ермолаев", 30);
    list.emplace_back("Витушкин", 55);
    sort(list);


    for (auto i = list.begin(); i != list.end(); i++)
    {
        cout << *i;
    }

Ошибка : error C2678: бинарный "<": не найден оператор, принимающий левый операнд типа "_Ty" (или приемлемое преобразование отсутствует);


Ответы (2 шт):

Автор решения: Andrej Levkovitch

Во-первых: не используйте using namespace std. Вот вы используете функцию sort - а какую вы юзаете: из стандартной библиотеки или свою самописную? Ладно еще в вашем случае сигнатуры не сходятся, но это ОЧЕНЬ плохая практика.

Во-вторых, так как вы используете все-таки свою не шаблонную функцию sort, то возникает вопрос: а откуда она знает как сравнивать ваши объекты? Вы сказали что создали operator<, но, позвольте, а откуда ваша функция о нем знает? У вас нету объявления этой функции, а определение ниже функции sort. Добавте объявление перед sort или вынесите туда определение

→ Ссылка
Автор решения: AR Hovsepyan
  • Любой конструктор класса должен инициализировать свои не
    инициализированные члены, в том числе и конструктор по умолчанию
    вашего класса. Например так:

    Student::Student() :name(" "), age(0) {};
    
  • Оператор сравнения выполняет какие то действия, не связанные с передаваемыми объектами, которые нужно сравнивать, и не принимает ни константные объекты,ни временные объекты. А также возвращает не результат сравнения, а информацию об отличии от нуля члена какого то объекта, в данном случаи возраста какого то постороннего студента, который к тому же не существует. Оператор нужно переписать:

    bool operator < (const Student& a, const Student& b)
    {  return a.age < b.age;   }
    
  • Только после определения этого оператора можно написать вашу функцию сортировки, дабы она знала как сравнивать. Но в условии цикла сравнения нужно определиться. Если вы хотите сортировать вектор от меньшего к большему, то менять местами тогда, когда сравниваемый элемент меньше, а не когда меньше тот, с чем сравниваете:

    void sort(vector<Student>& v) {
       int k = v.size();
       Student temp;
       for (int i = 0; i < k; i++)
           for (int j = i + 1; j < k; j++)
             if (v[j] < v[i]) //исправлено
             {
                 temp = v[i];
                 v[i] = v[j];
                 v[j] = temp;
             }
     }
    

Но лучше использовать стандартный алгоритм сортировки:

void sort(vector<Student>& v) {
    std::sort(v.begin(), v.end());
}
→ Ссылка