我试图找到存储在向量中的最大学生分数。 这是我的代码。 SL是学生对象的向量。
class Student{
public:
int returnScore(){return score;}
private:
int score;
};
class StudentList{
public:
vector<Student>sl;
bool compare( Student& s1,Student &s2)
{
return (s1.returnScore()<s2.returnScore());
}
void highest_score()
{
auto max_score = max_element(sl.begin(),sl.end(),compare);
if(max_score == sl.end()){}
//cout<<"Container empty.\n";
else{}
// cout<<*max_score;
}
};
int main()
{
StudentList l;
l.highest_score();
}
编译器将我带到C ++官方库并给出了错误。
error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&, Student&)>*)this)->__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&, Student&)>::_M_comp (...)', e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&, Student&)>*)this)->__gnu_cxx::__ops::_Iter_comp_iter<bool (StudentList::*)(Student&, Student&)>::_M_comp) (...)'|
答案 0 :(得分:0)
我的编译器告诉我compare
必须是静态函数,而不是常规成员函数:
static bool compare( Student& s1,Student &s2)
然后全部编译正常。
答案 1 :(得分:0)
auto max_score = max_element(sl.begin(),sl.end(),compare);
您无法执行此操作,因为compare
是一个方法,并且max_element
将没有此方法所属的对象。换句话说,您不能只调用compare
,因为您还需要为其调用对象。
您可以将比较变成静态方法:
static bool compare( Student& s1,Student &s2)
{
return (s1.returnScore()<s2.returnScore());
}
这将起作用。
或者,您也可以包装通话以进行比较:
auto max_score = max_element(sl.begin(),sl.end(),[this](Student& s1,Student& s2) {return compare(s1,s2);});
但是对我来说,似乎没有很多代码,而不是将compare变成函数/静态方法。
答案 2 :(得分:0)
如其他答案中所述,使类成员函数static
可以完成这项工作。另一种方法是在Student类中定义operator<
,例如
inline bool operator<(const Student& s2)
{
return (this->returnScore()<s2.returnScore());
}
并调用std :: max_element(使用默认运算符<)为
auto max_score = max_element(sl.begin(),sl.end());