2012-01-19 7 views
5

Aquí está el código de problema que estoy tratando de compilar:¿Cómo puedo vencer este error de clasificación vectorial C++?

bool TeamMatcher::simpleComparator(Student first, Student second){ 
    return (first.numberOfHrsAvailable < second.numberOfHrsAvailable); 
} 

void TeamMatcher::sortRosters(){ 
    sort(rosterExcellent.begin(), rosterExcellent.end(), simpleComparator); 
    sort(rosterGood.begin(), rosterGood.end(), simpleComparator); 
    sort(rosterOK.begin(), rosterOK.end(), simpleComparator); 
    sort(rosterPoor.begin(), rosterPoor.end(), simpleComparator); 
    sort(rosterNoSay.begin(), rosterNoSay.end(), simpleComparator); 
} 

Entonces aquí está el error que estoy recibiendo:

TeamMatcher.C: In member function ‘void TeamMatcher::sortRosters()’: 
TeamMatcher.C:51: error: no matching function for call to ‘sort(__gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, __gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, <unresolved overloaded function type>)’ 
/usr/include/c++/4.2.1/bits/stl_algo.h:2852: note: candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Student*, std::vector<Student, std::allocator<Student> > >, _Compare = bool (TeamMatcher::*)(Student, Student)] 

Se repite este error para las cuatro clases restantes. No entiendo, básicamente estoy copiando/pegando esta solución desde aquí: http://www.cplusplus.com/reference/algorithm/sort/

¡Cualquier ayuda sería muy apreciada!

+3

Agregó la directiva using namespace 'using namespace std;' a su archivo, si no es necesario que califique el nombre del algoritmo con 'std' namespace como' std :: sort'. –

+0

Lo hice, al menos en mi archivo .h que importé en este archivo .C. Eso sigue siendo bueno ¿verdad? –

+2

@Als: puede ver en el resultado del compilador que ya está viendo 'std :: sort' como candidato, lo que significa que ese no es el problema. – tzaman

Respuesta

8

Debe declarar su simpleComparator como un método static, de lo contrario no cabrá el tipo esperado por std::sort.

Para ser perfectamente correcto, también debe pasarlo como TeamMatcher::simpleComparator, ver here para más detalles.

+0

Aha! ¡Muchas gracias! ¡Esto lo solucionó! Manera de ganar en la vida –

+0

¡De nada! :) – tzaman

1

Prueba este lugar para su función de comparación:

bool simpleComparator(const Student& first, const Student& second){ 
    return (first.numberOfHrsAvailable < second.numberOfHrsAvailable); 
} 

Tenga en cuenta que la función de comparación no es miembro de la clase TeamMember, y pasando referencias const en impide la copia innecesaria.

Usted puede tomar un paso más allá y definir un método de comparación para los estudiantes

bool Student::operator<(const Student& first, const Student& second) 
{ 
    return (first.numberOfHrsAvailable < second.numberOfHrsAvailable); 
} 

Ahora sólo puede llamar a una especie en sus estudiantes y va a tener un método de comparación de usar:

std::sort(studentIter.begin(), studentIter.end()); 

Sin embargo, en este caso, recomiendo el primer enfoque, a menos que siempre desee comparar a los estudiantes por el número de horas disponibles. Por ejemplo, esto puede ser confuso para otro programador:

if (studentA < studentB) 
{ 
    // Do stuff 
} 

Puede ser confuso porque no es evidente cómo se comparan dos estudiantes (GPA, asistencias, horas disponibles, altura, índice de inteligencia, lo que sea ...)

Cuestiones relacionadas