Помещение объектов в очередь приоритетов в C ++, вызывающее недопустимые операнды в двоичном выражении - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу создать приоритетную очередь в C ++

Я создал структуру в качестве общего плана для создания экземпляра очереди приоритетов

template<typename T, typename priority_t>
struct PriorityQueue {
  typedef std::pair<priority_t, T> PQElement;
  std::priority_queue<PQElement, std::vector<PQElement>,
                 std::greater<PQElement>> elements;

  inline bool empty() const {
     return elements.empty();
  }

  inline void put(T item, priority_t priority) {
    elements.emplace(priority, item);
  }

  T get() {
    T best_item = elements.top().second;
    elements.pop();
    return best_item;
  }
};

Мой класс координат

/*
 * Structure for a coordinate
 */
class Coord{ 
    public:
        int x, y;

    public:
        Coord(int x1, int y1) {
            x = x1;
            y = y1;
        }
        int getX(void) {
            return x;
        }
        int getY(void) {
            return y;
        }
};

Я пытался положить в него предметы.Оператор put вызывает ошибку во время компиляции.

Coord start = Coord(0,0);
PriorityQueue<Coord, double> frontier;
frontier.put(start, 0);

Я получаю сообщение об ошибке:

invalid operands to binary expression ('const Coord' and 'const Coord')

Полный текст сообщения об ошибке

error: invalid operands to binary
      expression ('const Key' and 'const Key')
    return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second);
                                                                 ~~~~~~~~~~ ^ ~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/utility:582:16: note: in instantiation of function
      template specialization 'std::__1::operator<<double, Key>' requested here
    return __y < __x;
               ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:724:21: note: in instantiation of function
      template specialization 'std::__1::operator><double, Key>' requested here
        {return __x > __y;}
                    ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/algorithm:4973:13: note: in instantiation of member
      function 'std::__1::greater<std::__1::pair<double, Key> >::operator()' requested here
        if (__comp(*__ptr, *--__last))
            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/algorithm:5001:5: note: in instantiation of function
      template specialization
      'std::__1::__sift_up<std::__1::greater<std::__1::pair<double, Key> > &, std::__1::__wrap_iter<std::__1::pair<double, Key> *> >' requested here
    __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first);
    ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/queue:690:12: note: in instantiation of function template
      specialization 'std::__1::push_heap<std::__1::__wrap_iter<std::__1::pair<double, Key> *>, std::__1::greater<std::__1::pair<double, Key> > >' requested
      here
    _VSTD::push_heap(c.begin(), c.end(), comp);
           ^
lab1.cpp:87:14: note: in instantiation of function template specialization 'std::__1::priority_queue<std::__1::pair<double, Key>,
      std::__1::vector<std::__1::pair<double, Key>, std::__1::allocator<std::__1::pair<double, Key> > >, std::__1::greater<std::__1::pair<double, Key> >
      >::emplace<double &, Key &>' requested here
    elements.emplace(priority, item);
             ^
lab1.cpp:305:14: note: in instantiation of member function 'PriorityQueue<Key, double>::put' requested here
    frontier.put(start, 0);
             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/utility:572:1: note: candidate template ignored: could not
      match 'pair<type-parameter-0-0, type-parameter-0-1>' against 'const Key'
operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)

Что означает эта ошибка?Где я могу начать отлаживать эту ошибку?

1 Ответ

0 голосов
/ 17 февраля 2019

Для priority_queue значение, хранящееся в очереди, должно быть сортируемым.В вашем случае, с pair, существует встроенный для сравнения , который вы используете с std::greater.Это, в свою очередь, требует всех элементов пары для заказа.Ваш Coord класс не определяет operator<, поэтому вы получаете эту ошибку

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