Проблема c оператором присваивания

На днях решил попрактиковаться работать с классами ,в которых используется динамическая память.Для этого реализовал небольшой класса для работы с векторами. У меня возникла проблема: при попытке присвоить экземпляру класса другой экземпляр с которым проводились мат операции выдается следующая ошибка:

E0349 отсутствует оператор "=", соответствующий этим операндам

Я пробовал перегрузить оператор "=",так чтобы в параметра передавалась копия объекта(знаю,так делать не рекомендуется),но тогда ,при попытке копирования объекта, в аргументы метода компилятор выдает: Не имеется подходящего конструктора копии.

Также при попытке передавать в аргументы методов объект по ссылке на константу ,возникает ошибка(E1086 Объект содержит квалификаторы типа, несовместимые с элементом функции) в строчках кода где ведется работа с этим объектом.

Я первый раз обращаюсь за помощью на подобные ресурсы,т.к обычно на решение какой-либо проблемы у меня не уходит больше дня,но здесь мне ничего не приходит в голову.С++ начал изучать недавно,поэтому если найдете какие-то недочеты в код ,то пожалуйста пишите о них.

Сам код:

#include<iostream>

using namespace std;

class Vector2D
{
private:
    double* x = nullptr;
    double* y = nullptr;


public:

    Vector2D(double x, double y)
    {
        this->x = new double{ x };
        this->y = new double{ y };
    }

    Vector2D(const Vector2D& other)
    {
        if (this->x == nullptr || this->y == nullptr)
        {
            this->x = new double;
            this->y = new double;
        }


        //Объект содержит квалификаторы типа, несовместимые с элементом функции


        *this->x = other.get_x();
        *this->y = other.get_y();
    }

    double get_x()
    {
        return *x;
    }

    double get_y()
    {
        return *y;
    }

    Vector2D& operator =(const Vector2D& other)
    {

        //Объекы содержит квалификаторы типа,несовместимые с элементом функции*


        *this->x = other.get_x(); 
        *this->y = other.get_y();

        return *this;
    }





    template<typename T, class = enable_if_t< (is_same<T, int>::value) || (is_same<T, double>::value) >> Vector2D operator *(T factor)
    {
        Vector2D  result(this->get_x() * factor, this->get_y() * factor);

        return  result;
    }

    ~Vector2D()
    {
        delete x;
        delete y;
    }

    friend void print(Vector2D& obj);
};

void print(Vector2D& obj)
{
    cout << "{" << *obj.x << ";" << *obj.y << "}" << endl;
}

int main(int argc, char* argv)
{

    Vector2D a(5, 1);
    Vector2D b(7, 1);

    b = a * 5; // отсутствует оператор "=", соответствующий этим операндам

    print(b);

    return 0;
}

Ответы (1 шт):

Автор решения: user393643

Следующий код компилируется (добавил const функциям-членам и включил заголовочные файлы):

#include <type_traits>
#include <iostream>

using namespace std;

class Vector2D
{
private:
    double* x = nullptr;
    double* y = nullptr;


public:

    Vector2D(double x, double y)
    {
        this->x = new double{ x };
        this->y = new double{ y };
    }

    Vector2D(const Vector2D& other)
    {
        if (this->x == nullptr || this->y == nullptr)
        {
            this->x = new double;
            this->y = new double;
        }


        //Объект содержит квалификаторы типа, несовместимые с элементом функции


        *this->x = other.get_x();
        *this->y = other.get_y();
    }

    double get_x() const 
    {
        return *x;
    }

    double get_y() const
    {
        return *y;
    }

    Vector2D& operator =(const Vector2D& other)
    {

        //Объекы содержит квалификаторы типа,несовместимые с элементом функции*


        *this->x = other.get_x(); 
        *this->y = other.get_y();

        return *this;
    }





    template<typename T, class = enable_if_t< (is_same<T, int>::value) || (is_same<T, double>::value) >> Vector2D operator *(T factor)
    {
        Vector2D  result(this->get_x() * factor, this->get_y() * factor);

        return  result;
    }

    ~Vector2D()
    {
        delete x;
        delete y;
    }

    friend void print(Vector2D& obj);
};

void print(Vector2D& obj)
{
    cout << "{" << *obj.x << ";" << *obj.y << "}" << endl;
}

int main(int argc, char* argv)
{

    Vector2D a(5, 1);
    Vector2D b(7, 1);

    b = a * 5; // отсутствует оператор "=", соответствующий этим операндам

    print(b);

    return 0;
}
→ Ссылка