На функцию "Vector :: operator = (const Vector &) throw ()" (объявленную неявно) нельзя ссылаться - это удаленная функция - PullRequest
0 голосов
/ 11 июля 2019

У меня есть Vector класс. В настоящее время это выглядит так:

class Vector{        
    double PI  = 2 * acos(0.0);
    double EPSILON = 1e-4;

    public:
        double x,y,z;

        Vector() : x(0.0),y(0.0),z(0.0) {}

        Vector(double _x,double _y,double _z) : x(_x), y(_y), z(_z){}

        // some more code...
    Vector& operator += (const Vector &vect) {
        *this = *this + vect;
        return *this;
    }

    Vector& operator += (const double &value){
        *this = *this - value;
        return *this;
    }

    // some more operator overloading....

    inline bool isNearlyEqual (const double &a,const double &b) const{
       return std::abs(a - b) < EPSILON;
    }

    inline double radiansToDegree (const double &radians) const {
       return radians * 180.0 / PI;
    }

    // some more code...

Теперь, когда я пытаюсь сделать две приватные переменные PI и EPSILON const, тогда выдается соответствующая ошибка вокруг строк перегрузки оператора. Если я сделаю это const static, то вызову:

function call must have a constant value in a constant expression

более acos(0.0). То же самое происходит, если я пытаюсь сделать это static constexpr. Что означают эти сообщения и как я могу их обойти?

1 Ответ

0 голосов
/ 11 июля 2019

Ваша проблема заключается в том, что неявное operator =() удаляется [цитата нужна] , когда у вас есть const квалифицированные члены класса.Выполнение *this = ... больше не действует в ваших += операторах.

У вас есть несколько простых вариантов:

  • Переместить PI и EPSILON за пределы класса;может быть, в пространство имен, в котором все находится, или пространство имен констант, или что-то в этом роде.
  • Вместо *this =... явно установите x, y, z в ваших операторах.
  • Перегрузите оператор operator =() всделайте выше

Я бы порекомендовал первое, если вы считаете, что вам нужно будет использовать PI и EPSILON в другом месте, в противном случае третье.В любом случае использование вашего Vector класса будет меньше головной боли, потому что вы сможете скопировать их с помощью оператора =.

EDIT

Вы также спросили, чтоошибка означает.Я не могу сказать, что когда-либо видел

function call must have a constant value in a constant expression

раньше, но это может иметь какое-то отношение к вопросу Математические функции Constexpr

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