2016-01-20 2 views
3

Я получил вектор, инициализированный таким образом vector<unique_ptr<Worker>> Workers. Рабочий - это базовый класс с закрытым именем поля и имеет два производных класса: Builder и Driver.Сортировка вектора unique_ptr's

добавить к Workers векторных объектов Builder и драйвер, а затем я хочу, чтобы отсортировать вектор по имени, используя #include <algorithm> так:

sort(Workers.begin(), Workers.end(), cmp_by_name); 


bool cmp_by_name(const Worker &a, const Worker &b) 
{ 
    return a.getName() < b.getName(); 
} 

но VS говорит, что

Ошибка 1 ошибка C2664: 'bool (const Worker &, const Worker &)': не может преобразовать аргумент 2 из 'std :: unique_ptr>' в 'const Worker &' c: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ algorithm 3071 1 A pp

Можете ли вы мне помочь?

EDIT:

Благодаря @NathanOliver, @ Rabbid76 и этот вопрос Sorting a vector of custom objects я отредактировал мой cmp_by_name к этой форме:

struct cmp_by_name 
    { 
     inline bool operator()(const unique_ptr<Worker>& a, const unique_ptr<Worker>& b) 
     { 
      return a->getName() < b->getName(); 
     } 
    }; 

И я называю своего рода функцию, как это:

sort(Workers.begin(), Workers.end(), cmp_by_name()); 
+1

Подпись предиката неверна. – Lingxi

ответ

8

Функция сравнения std::sort использует значение в форме

bool cmp(const Type1 &a, const Type2 &b); 

Если типы Type1 и Type2 должны быть такими, чтобы итератор мог быть разыменован и затем неявно преобразован в обе из них.

В вашем случае разыменование Workers.begin() дает вам unique_ptr<Worker> не Worker. Вам нужно будет изменить функцию сравнения взять const unique_ptr<Worker>&

В этом случае было бы обмотать выглядеть как

bool cmp_by_name(const std::unique_ptr<Worker>& a, const std::unique_ptr<Worker>& b) 
{ 
    return a->getName() < b->getName(); 
} 
+0

Можете ли вы рассказать мне, как мне вызвать функцию sort (Workers.begin(), Workers.end(), cmp_by_name); в таком случае? –

+0

@DaArtagnan Я не уверен, что вы имеете в виду. Если вы читаете 'cmp_by_name' так, как я его отвечу, тогда он должен работать. – NathanOliver

4

Тип данных вашего std::vector<std::unique_ptr<Worker>> является std::unique_ptr<Worker>, поэтому ваша функция сравнения должна выглядеть следующим образом:

bool cmp_by_name(const std::unique_ptr<Worker> &a, const std::unique_ptr<Worker> &b) 
{ 
    return a->getName() < b->getName(); 
} 

функция сравнения ожидает аргументы таким образом, чтобы объект std::vector может конвертировать их.

Смежные вопросы