Оператор перегрузки <для приоритетной очереди - PullRequest
5 голосов
/ 23 июня 2011

Я пытаюсь создать приоритетную очередь для класса, который я создал следующим образом -

std::priority_queue<Position> nodes;

Я перегружал оператор <в позиции следующим образом - </p>

bool Position::operator<(Position& right) {
    return (fvalue < right.getFValue());
}

Однако всякий раз, когдаЯ пытаюсь скомпилировать, я получаю это сообщение об ошибке, в котором говорится, что оператор <не перегружен - </p>

error: no match for ‘operator<’ in ‘__x < __y’
position.h:30: note: candidates are: bool Position::operator<(Position&)

Чего мне здесь не хватает?Любая помощь приветствуется.

Ответы [ 2 ]

13 голосов
/ 23 июня 2011

Реляционные операторы не должны изменять операнды.Попробуйте:

bool Position::operator<(const Position& right) const {

Я предполагаю, что либо __x, либо __y (или оба) равны const.Вы не можете вызвать неконстантную функцию-член для __x, если она const, также вы не можете передать __y в качестве параметра right, если __y равно const, а right нет.

0 голосов
/ 24 июня 2011
  1. Желательно не перегружать операторы сравнения только для удовлетворения коллекции. (http://google -styleguide.googlecode.com / SVN / багажник / cppguide.xml # Operator_Overloading ). Лучше использовать объекты или функции компаратора, если это возможно. Если ваш оператор определяет порядок упорядочения этих объектов, а не просто их приоритет в очереди, тогда все в порядке. Но если нет, у вас могут возникнуть проблемы, если другой разработчик использует вашего оператора в другом контексте.

  2. Я не уверен, что такое fvalue, но, возможно, для него не определено operator <.

...