2012-12-18 3 views
2

Почему я получаю сообщение об ошибке, когда я не ставил const в функцию bool operator<(const Node& otherNode) //const?Оператор перегрузки C++ <ошибка

stl_algo.h:91: error: passing 'const Node' as 'this' argument of 'bool Node::operator<(const Node&)' discards qualifiers 

Должны ли все перегруженные операторы быть постоянными?

class Node { 
public: 
    double coordinate; 

    bool operator==(const Node& other) const{ 
     return coordinate == other.coordinate; 
    } 

    bool operator<(const Node& other) const{ 
     return coordinate < other.coordinate; 
    } 
}; 

ответ

6

Не все операторы, но == и < обязательно должны быть сделаны const, да. Они логически не изменяют ни один из сравниваемых объектов.

ошибка, вероятно, происходит от вызова метода не- const из const один, например:

bool isSmaller(const Node& other) const 
{ 
    return *this < other; 
} 

В этом случае, так как метод isSmaller является const, this является неявно const объект, поэтому operator < также должен быть const, чтобы звонок в этом контексте был действительным.

Из сообщения об ошибке, то оказывается, что Node::operator < вызывается на const объекта из функции в stl_algo.h - сортировка/приказывать функции, хэширования функции и т.д.

+0

Да у меня был тест по программированию, а затем я паниковать, потому что сравнивать перегрузки оператора не работает, то я просто положить сопзЬ и но я сомневался, что все операторы должны быть const. Теперь я понимаю. Благодарю. – BRabbit27

1

Операторы сравнения, такие как <, >, <=, >=, ==, != должен работать на объектах const в целом, поскольку нет никакого смысла, если любые сравниваемые объекты могут быть изменены путем сравнения. Но вы можете объявлять сравнения как функции, не являющиеся членами, чтобы обеспечить симметрию между обоими операндами.

class Node { 
public: 
    double coordinate; 
}; 
inline operator<(const Node& lhs, const Node& rhs) 
{ 
    return lhs.coordinate < rhs.coordinate; 
} 
+0

Почему downvote? – juanchopanza

0

Вы пытаетесь удалить модификатор const метода? Кроме того, как @LuchianGrigore sugest, вы можете использовать ключевое слово this:

bool operator< (const Node& other) { 
    return this.coordinate < other.coordinate; 
} 
+0

Да Если я не помещаю 'const', у меня есть ошибка, тогда как если я его положу, она работает правильно. Я просто хотел знать, должны ли операторы быть всеми функциями const. – BRabbit27

+0

Я никогда не объявлял для этого метод как const. Я не понимаю, почему вы получаете эту ошибку. Взгляните на это: http://www.cplusplus.com/doc/tutorial/classes2/ – adripanico

+0

Просто прочитайте ответ @LuchianGrigore – BRabbit27

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