我有一个带有对象Studenti的列表,这些对象是用多个参数定义的。我想对这份名单上的学生进行排序,首先根据他们的平均水平,如果是相同的话,我会按字母顺序排序。
在我的类学生中,我声明了这个标头函数:bool mediaDescrescator(const&, const&);,它是以这种方式实现的:
bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
{
if(a.medie_ != b.medie_)
{
return (a.medie_ > b.medie_);
}
return (a.nume_ > b.nume_);
}medie_是Studenti的双重私有成员,nume_是std::string私有成员
总的来说,我有一个Studenti列表:std::list<Studenti> listaStud_ = {stud1, stud2, stud3, stud4, stud5};
函数调用:std::sort(listaStud_.begin(), listaStud_.end(), mediaDescrescator);
我的错误是: mediaDescrescator未在此范围内声明。
我见过关于这类类型的其他主题,它们与我的主题一样声明,我甚至尝试了向量类型,而不是list。调用mediaDescrescator时不带(),因为它必须作为函数指针或函数对象传递。
发布于 2017-11-07 13:43:24
mediaDescrescator是Studenti的一个成员函数。它是通过类的词法范围来定义的。所以您可以访问Studenti::mediaDescrescator,但不能访问mediaDescrescator。全局命名空间中没有名为mediaDescrescator的函数。
此外,为了避免您可能面临的下一个错误,请确保它是一个static成员函数。毕竟,您不需要一个有效的实例来调用它。它不访问this的任何成员变量。
发布于 2017-11-07 13:50:19
std::tie返回引用的std::tuple。std::tuple定义了比较运算符,这些运算符执行正确的字典比较。所以,您所需要做的就是将Studenti转换为一个带有tie的tuple,然后比较这些元组。
bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
{
return std::tie(a.medie_, a.nume_) > std::tie(b.medie_, b.nume_);
}您可能会发现在编写的类中提供一个名为as_tuple()的方法是有用的:
struct Studenti
{
// rest of class
auto as_tuple() const { return std::tie(medie_, nume_); }
};发布于 2017-11-07 13:52:43
您的实现有几个问题。第一个,也是编译器抱怨的一个问题是,mediaDescrescator是在Studenti的作用域中定义的,您试图在全局范围内访问它,使用Studenti::mediaDescrescator获取指向它的指针。其次,mediaDescrescator是Studenti的正常成员函数,因此需要在对象上调用它。可以通过将其改为静态成员函数,或者使其接受一个参数并与当前对象进行比较来解决这个问题。第三,std::sort函数不能应用于std::list,因为它需要随机访问迭代器,而std::list只提供双向迭代器。
https://stackoverflow.com/questions/47159407
复制相似问题