2015-12-03 5 views
0

У меня есть структура (A) и очередность приоритетов (PQ) в другой структуре (B).C++) Недопустимые операнды для двоичного выражения Ошибка с приоритетной очередью

Это структура А ниже:

struct Node{ 
int level; 
int total; 
std::vector<int> sequence; 

void clear(){ 
    sequence.clear(); 
} 

void init(){ 
    level = 0; 
    total = 0; 
    sequence.clear(); 
} 

long subjectNumber(){ 
    return sequence.size(); 
} 

bool isInSequence(int index){ 
    for(int i = 0; i < sequence.size(); i++){ 
     if(index == sequence.at(i)){ 
      return true; 
     } 
    } 
    return false; 
}}; 

Ничего особенного не так ли?

и я использую приоритет очереди Node объектов, как показано ниже:

std::priority_queue<Node> pq; 

Но когда я запускаю проект, я получил сообщение об ошибке:

инвалидные операнды в двоичном выражении («Const Node» и 'Const Node')

Я хочу поставить высший приоритет для общей стоимости объекта Node Как я могу решить эту проблему?

UPDATED: 
The picture is what I'm getting, at the project, there is no 'red'Line for me! 

enter image description here

+0

Я обнаружил, что мне нужно переопределить метод метода метода ... но когда и как я должен это делать? – LKM

+1

Проблема в коде, который здесь не показан. –

+0

Вы не можете получить эту ошибку при запуске проекта. Вы должны получать его при компиляции проекта. –

ответ

3

Для того, чтобы иметь возможность использовать std::priority_queue<Node>, вы нужна действительная функция меньше, чем операторская для Node.

Вы можете определить перегрузку operator< как функцию-член или функцию, не являющуюся членом.

перегрузка функции члена

struct Node{ 
    int level; 
    int total; 
    std::vector<int> sequence; 

    void clear(){ 
     sequence.clear(); 
    } 

    bool operator<(Node const& rhs) const { ... } 
}; 

Non-член функции перегрузка

struct Node{ 
    int level; 
    int total; 
    std::vector<int> sequence; 

    void clear(){ 
     sequence.clear(); 
    } 

}; 

bool operator<(Node const& lhs, Node const& rhs) { ... } 

Использование Compare класса

Вы можете также использовать Compare класс, который обеспечивает возможность сравнения двух Node объектов:

struct NodeCompare 
{ 
    bool operator()(Node const& lhs, Node const& rhs) { ... } 
}; 

и использовать его для создания std::priority_queue объекта.

using MyQueue = std::priority_queue<Node, NodeCompare>; 
MyQueue queue; 
+0

@R Sahu brother, что вы мне сказали, работает, но не идеально, я думаю, что оператор перегруженного метода просто покрывает сравнение только двух объектов Node ... Разве это не проблема? Часто встречаются исключения из моей программы – LKM

+0

@LKM, которая является основной функциональностью, необходимой для 'priority_queue'. Трудно сказать, что может быть причиной исключений. Создайте еще один вопрос с [Минимальным, полным и проверяемым примером] (http://stackoverflow.com/help/mcve). –

4

std::priority_queue требует, чтобы тип элемента обеспечивает перегруженный operator< (или компаратор через Compare аргумента шаблона):

bool operator<(const Node& lhs, const Node &rhs) { 
    // ... 
} 
+0

Хорошо спасибо @vitaut! Но где и как я мог это сделать? – LKM

+0

Вы можете перегрузить 'operator <' функцию как функцию-член или функцию, не являющуюся членом. –

+0

@RSahu Должен ли я перегружать structA (== struct Node)? – LKM

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

  • Нет связанных вопросов^_^