Неверная инициализация ссылочного типа 'Class &' из выражения типа 'Class' - PullRequest
0 голосов
/ 04 декабря 2018

Хорошо, ребята, у меня есть список объектов, и я хочу отсортировать мой список по созданной мной булевой функции.

Функция ->

 bool funct(Student &s1,Student &s2)
{
    return s1.calculMedie()<s2.calculMedie();

}

Я получил этот список:

list<Student*> list;
list.push_back(sx[0]);
list.push_back(sx[1]);
list.push_back(sx[2]);

sx приходит из этой декларации-> Student **sx=new Student*[3]; Я создал 3 объекта класса типа Student.

Я хочу отсортировать их по 'calculMedie ()', который являетсяфункция, которая возвращает их среднюю оценку.

double Student::calculMedie()
{
    int nr=0;
    double s=0;
    for(auto i : note)
       {
         nr++;
         s=s+i;
       }

       return s/nr;} 

^ вот как это выглядит.

И когда я попытался сделать list.sort(list.begin(),list.end(),funct), я получаю такую ​​ошибку: «Неверная инициализация ссылочного типа« Класс & »из выражения типа« Класс »»

1 Ответ

0 голосов
/ 04 декабря 2018

Похоже, вы смешали std::sort алгоритм с list<T>::sort методом.Список можно отсортировать только с помощью метода sort.

Существует две перегрузки list::sort:

 void sort();   
 template< class Compare > 
 void sort( Compare comp ); // [2]

, если вы хотите отсортировать по компаратору, напишите следующее:

list<Student*> list;
list.sort (funct);

, поскольку в списке хранятся указатели на Student, необходимо изменить сигнатуру функции-функции, она должна принимать указатели, а не ссылки:

bool funct(Student* s1,Student* s2)
{
    return s1->calculMedie()<s2->calculMedie();
}

хорошей практикой является передача s1, s2как указатели на const объект, когда вы изменяете s1, s2 на const Student* s1, const Student* s2, вам также нужно сделать calculMedie как const функцию-члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...