If I define the compare
function as follows:
bool compare(Student& a, Student& b) { return an < bn; }
g ++ will complain:
g++ -Wall main.cpp -o main In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/algorithm:63:0, from main.cpp:1: /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h: In function '_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >, _Tp = Student, _Compare = bool (*)(Student&, Student&)]': /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h:2261:78: instantiated from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >, _Compare = bool (*)(Student&, Student&)]' /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h:2302:62: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >, _Size = long int, _Compare = bool (*)(Student&, Student&)]' /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h:5250:4: instantiated from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<Student*, std::vector<Student> >, _Compare = bool (*)(Student&, Student&)]' main.cpp:38:51: instantiated from here /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h:2229:4: error: invalid initialization of reference of type 'Student&' from expression of type 'const Student' /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/stl_algo.h:2232:4: error: invalid initialization of reference of type 'Student&' from expression of type 'const Student' Compilation exited abnormally with code 1 at Mon May 28 08:05:35
But if I define a comparison with the const
type, it will compile and work fine.
And here is the whole code:
class Student { public: Student(string); string n; }; bool compare(Student& a, Student& b) { return an < bn; } Student::Student(string name) { n = name; } int main() { Student A = Student("A"); Student B = Student("B"); vector<Student> students; students.push_back(B); students.push_back(A); sort(students.begin(), students.end(), compare); cout << "After sort" << endl; for(vector<Student>::iterator i = students.begin(); i != students.end(); ++i) { cout << "Student: " << i->n << endl; } return 0; }