Не могу использовать Operator!= для bool

#c #operator-keyword

#c #operator-ключевое слово

Вопрос:

Я создал operator для !=

 PairXY operator != (PairXY a, PairXY b) {
PairXY res(a.x != b.x, a.y != b.y);
return res;
}
  

И я хочу использовать его в этом цикле:

 while (l.b!=l.a){}
  

Но это выдает мне эту ошибку: не удалось преобразовать ‘operator!= (l.Line::b, l.Line::a)’ в ‘bool’, я попытался изменить PairXY оператора на bool, но это все еще не помогло.

Комментарии:

1. Можете ли вы показать определение PairXY ?

2. Вероятно, это должно выглядеть так: bool operator!=(const PairXYamp; a, const PairXYamp; b) { return !(a == b); } — другими словами, повторно используйте == оператор, который ожидается, если вы предоставите !=

Ответ №1:

bool operator != (PairXY a, PairXY b) { … }

Ответ №2:

Возвращаемый тип должен быть bool :

 bool operator != (const PairXY amp; a, const PairXY amp; b);
  

Кроме того, лучше сделать параметры const ссылочными, как я показал выше.

Комментарии:

1. Помните, что если вы не поставите amp; , вы вызовете copy-constructor. const позволяет использовать его для объектов const, если они у вас есть.

2. @Shahbaz: Да. Вот почему я поставил amp; .

Ответ №3:

Вы хотите вернуть пару (вероятно) чисел или одно логическое значение?

Обычно кортежи отличаются (математически), когда какой-либо компонент попарно отличается. Итак, я бы закодировал что-то вроде

 bool operator != (PairXY a, PairXY b) { return a.x != b.x || a.y != b.y; }
  

но, возможно, вы хотите что-то еще (но тогда я не буду это называть != ).

Комментарии:

1. @JeremyFriesner: Свободная функция не может быть объявлена const .

Ответ №4:

Вероятно, именно таким и должен быть ваш код.

 class PairXY {
public:
    PairXY( int _x, int _y): x(_x),y(_y){}

    bool operator != (const PairXY a) {
        return(this->x != a.x amp;amp; this->y != a.y);
    }
private:
    int x;
    int y;
};
int main ( int argc, char** argv ) {
    return 0;
}
  

Комментарии:

1. Это не сработало бы для этого, если a есть const в выражении a!=b .