Компиляция проблема равенства / неравенства операторов - PullRequest
0 голосов
/ 14 октября 2011

У меня следующая кодовая последовательность И я не понимаю ошибку компиляции (ниже кода).

Заранее спасибо,

Юлианский

class X {
public:

    int a;

    X()
    {
        a = 0;
    }

    bool operator == (const X&r)
    {
        return  a == r.a;
    }

    bool operator != (const X&r)
    {
        return !( *this == r );
    }
};

class DX : public X
{
public:
    int dx;
    DX()
    {
        dx = 1;
    }

    bool operator == (const DX&r)
    {

        if( dx != r.dx ) return false;
        const X * lhs = this;
        const X * rhs = &r;

        if ( *lhs != *rhs ) return false;

        return true;
    }

    bool operator != (const DX&r)
    {
        return !( *this == r );
    }
};

int main(void)
{
    DX d1;
    DX d2;
    d1 == d2;
    return 0;
}

Ошибка:

d: \ Projects \ cpptests> cl. Opequal.cpp. 32-битный оптимизирующий компилятор C / C ++ версии 15.00.30729.01 для 80x86 Copyright (C) Microsoft Corporation.Все права защищены.

opequal.cpp opequal.cpp (38): ошибка C2678: бинарный '! =': Не найден оператор, который принимает левый t-ручной операнд типа 'const X' (или существуетнедопустимое преобразование) opequal.cpp (16): может быть 'bool X :: operator! = (const X &)' при попытке сопоставить список аргументов '(const X, const X)'

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

Вам необходимо объявить ваши функции operator== и operator!= как постоянные.

Например.

bool operator == (const X&r) const
1 голос
/ 14 октября 2011

Ваши объявления функций оператора должны выглядеть следующим образом

bool operator == (const X&r) const

Помещение const в конец функции-члена обещает, что функция не изменяет ни одного члена класса (если такие члены не объявлены mutable).Предполагается, что любая функция, не имеющая этого ключевого слова, является мутатором, и компилятор не позволяет вызывать их в экземпляре класса const.

Вы можете перегрузить функцию с одинаковыми аргументами с и без const,В этом случае версия const будет вызываться только для экземпляров класса const.Например, контейнеры STL перегружают свой оператор [], возвращая константные ссылки вместо простых ссылок.

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