проблема при создании пользовательской сортировки в C ++ для вектора указателей - PullRequest
0 голосов
/ 21 декабря 2011

Я пытаюсь создать пользовательскую сортировку для вектора указателей классов, используя предикат сортировки:

struct sort_by_airtime                                                                                            
{                                                                                                                 
    inline bool operator() (const Network *n1, const Network *n2)                                                 
    {                                                                                                             
      return (n1->airtime() < n2->airtime());                                                                     
    }                                                                                                             
};      

Для каждой сети мы сортируем по значению с плавающей точкой, возвращаемому функцией airtime ().

Теперь я попытаюсь использовать это следующим образом:

std::vector<Network *> Simulator::sort_networks(std::vector<Network *> netlist, bool sort_airtime) {

  std::vector<Network *> new_netlist = netlist;

  if(sort_airtime) {
    sort(new_netlist.begin(), new_netlist.end(), sort_by_airtime());
  }

}

Однако я получаю много ошибок, подобных этой:

In file included from Simulator.cpp:7:
Simulator.h: In member function ‘bool Simulator::sort_by_airtime::operator()(const Network*, const Network*)’:
Simulator.h:48: error: passing ‘const Network’ as ‘this’ argument of ‘virtual float Network::airtime()’ discards qualifiers
Simulator.h:48: error: passing ‘const Network’ as ‘this’ argument of ‘virtual float Network::airtime()’ discards qualifiers

Правильно ли я указываю аргумент, передаваемый предикату? airtime () реализуется классами, которые наследуют класс Network.

Ответы [ 3 ]

5 голосов
/ 21 декабря 2011

Компилятор предупреждает вас о том, что Network::airtime() игнорирует квалификаторы const для n1 и n2.

Решением будет создание "const -корректной" версииNetwork::airtime() (при условии, что это на самом деле ничего не меняет).

См. этот ответ для примера.

3 голосов
/ 21 декабря 2011

Ваша функция-член должна быть объявлена ​​как const Функция-член как:

virtual float Network::airtime() const 
                                 ^^^^^ //this makes the function const

потому что указатели, которые вы используете в operator(), указывают на const объекты типа Network.

1 голос
/ 21 декабря 2011

Network::airtime() не является const, и поэтому не может быть вызвано через const Network*, который у вас есть в sort_by_airtime.

Если возможно, лучшее решение - сделать airtime() const;в противном случае измените аргументы sort_by_airtime на Network*.

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