Сортировкой вектора объектов по 3 параметрам

Есть вектор с указателями на книги. Надо его отсортировать по дате(по году, потом по месяцу и дню). Еще кстати не знаю, если в векторе указатели, то и в comparator надо ставить * или &? Питаюсь сделать так

  bool comparator( Book& a, Book& b) {
    if (a.GetYear() < b.GetYear()) return true;
    if (a.GetYear() > b.GetYear()) return false;
    if (a.GetMonth() < b.GetMonth()) return true;
    if (a.GetMonth() > b.GetMonth()) return false;
    return a.GetDay() < b.GetDay();
}
sort(books.begin(), books.end(), comparator)

Выдает такие ошибки

error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3

Пытался сделать с перегрузкой

bool operator<(Book* book1, Book* book2)
    {
        if (book1->GetYear() == book2->GetYear())
        {
            if (book1->GetMonth() == book2->GetMonth())
                return book1->GetDay() < book2->GetDay();
 
            return book1->GetMonth() < book2->GetMonth();
        }
        return book1->GetYear() < book2->GetYear();
    }
    sort(books.begin(), books.end())

Выдает это

error C2804: бинарный "operator <" имеет слишком много параметров
error C2333: HeroFunctions<T,U>::operator <: ошибка в объявлении функции; пропуск основного текста 
  функции
error C2333: HeroFunctions<std::string,Hero>::operator <: ошибка в объявлении функции; пропуск 
 основного текста функции

Вот тут проект. Думаю будет проще, если запустите и там увидете ошибку и сможете исправить


Ответы (1 шт):

Автор решения: Джонни Кэтсвилл

Параметры компаратора это ссылки на сравниваемые элементы. Вы пытаетесь отсортировать вектор указателей, следовательно, компаратор должен принимать ссылки на указатели:

bool comparator(const Book* const &aa, const Book* const &bb) {

    const Book& a = *aa;
    const Book& b = *bb;

    if (a.GetYear() < b.GetYear()) return true;
    if (a.GetYear() > b.GetYear()) return false;
    if (a.GetMonth() < b.GetMonth()) return true;
    if (a.GetMonth() > b.GetMonth()) return false;
    return a.GetDay() < b.GetDay();
}
→ Ссылка