Как мне победить эту C ++ Vector Sorting error? - PullRequest
5 голосов
/ 19 января 2012

Вот код проблемы, которую я пытаюсь скомпилировать:

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);
}

Тогда вот ошибка, которую я получаю:

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)]

Повторяет эту ошибку для четырех оставшихся сортов. Я не понимаю, я в основном копирую / вставляю это решение отсюда: http://www.cplusplus.com/reference/algorithm/sort/

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

8 голосов
/ 19 января 2012

Вам необходимо объявить ваш simpleComparator как метод static, в противном случае он не будет соответствовать типу, ожидаемому std::sort.

Чтобы быть совершенно правильным, вы должны также передать его как TeamMatcher::simpleComparator, подробности см. здесь .

1 голос
/ 19 января 2012

Попробуйте вместо этого использовать функцию сравнения:

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

Обратите внимание, что функция сравнения не является членом вашего класса TeamMember, и передача константных ссылок предотвращает ненужное копирование.

Вы можете сделать еще один шаг и определить метод сравнения для студентов

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

Теперь вы можете просто вызвать метод сортировки для ваших студентов, и у него будет метод сравнения:

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

Однако в этом случае я рекомендую первый подход, если вы не хотите всегда сравнивать студентов по количеству доступных часов. Например, это может сбить с толку другого программиста:

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

Это может сбивать с толку, потому что не совсем понятно, как бы вы сравнили двух студентов (средний балл, посещаемость, количество часов, рост, IQ и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...