从类型'Class'的表达式无效的引用类型'Class&'的初始化

时间:2018-12-04 18:59:45

标签: class sorting stl

好的,我有一个对象列表,我想按我创建的布尔函数对列表进行排序。

功能->

 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类学生类型的对象。

我想通过'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)时,我得到此错误:“从类型'Class'的表达式对引用类型'Class&'的无效初始化”

1 个答案:

答案 0 :(得分:0)

似乎您将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的指针,所以您需要修改funct函数的签名,它必须使用指针而不是引用:

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

优良作法是将s1,s2作为指向 const 对象的指针,当您将s1,s2更改为const Student* s1, const Student* s2时,还需要将calculMedie设置为 const 成员函数。