Проблема оператора члена класса преобразования типа C ++ - PullRequest
1 голос
/ 06 апреля 2020

Существует два простых класса:

class X
{
    int value;

public:

    X() : value(0) {};

    X(int v) : value(v) {};

    X(const X& x) {     // Does not help!
        this->value = x.value;
    }

    X(const X&& x) noexcept { // Does not help!
        this->value = x.value;
    }

    X& operator=(const X& right)  { // Does not help!
        this->value = right.value;
        return *this;
    };

    X&& operator=(const X&& right) noexcept  { // Does not help!
        this->value = right.value;
        return std::move(*this);
    };

    bool operator==(X& right) const {
        return this->value == right.value;
    };

};

class Y
{
    int value;

public:

    Y() : value(0) {};

    operator X() const {

        return X(this->value);

    };  // Y objects may be converted to X
};

и пример использования:

int main()
{

X x1, x2;
Y y1;

x1 = x2;   // Compiles (using the X& operator=)

x1 = std::move(x2);   // Compiles (using the X&& operator=)

auto newv = (X)y1; // Compiles 

x1 == newv;   // Accepted!

x1 == (X)y1;   // Error!!!

} // END: main()

x1 == (X) y1 строка генерирует ошибку C2678: binary '= = ': не найден оператор, который принимает левый операнд типа' X '(или нет приемлемого преобразования)

и "no operator == соответствует этим операндам, типы операндов X == X

Я пытаюсь скомпилировать его с C ++ 17.

Что с ним не так, если строка типа "x1 == newv" подходит для компилятора?

1 Ответ

3 голосов
/ 06 апреля 2020
bool operator==(X& right) const

должно быть

bool operator==(const X& right) const
//               ^^

, в противном случае его нельзя вызвать с временным X, что (X)y1 равно.

https://ideone.com/tN1w8T

Другая проблема, которая не связана с вашей ошибкой компилятора из моего комментария:
bool operator=(X& left) const это оператор сравнения == или присвоение =? Объявление функции представляет собой смесь, а реализация - это сравнение. Назначение будет X& operator=(const X& left) {value = left.value; return *this;}.

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