Перегрузка оператора C ++ - Какой тип операнда я действительно возвращаю? - PullRequest
2 голосов
/ 10 ноября 2019

Я пытаюсь перегрузить некоторые операторы для моего класса Vector, но при попытке утверждать (v + v == v * 2) получается ошибка ниже:

[Ошибка] нет соответствия для 'operator == '(типы операндов: Vector и Vector).

При использовании assert (v == v) функция работает нормально, и я также могу создавать новые векторы, используя +и * оператор.

class Vector{

private:    
    vector<double> arr;  

    friend bool operator ==(  Vector &src,  Vector &src2) {
        int z = src.size();     
        if (z != src2.size()){
            return false;
        }

        for (int i = 0;  i < src.size(); i++){
            double p = src.at(i);
            if (p != src2.at(i)){ 
                return false;
            }
        };
        return true;
        };

    friend Vector operator +(Vector &src, Vector &src2)  {
        Vector TEMP = src;      
        for (int i = 0;  i < src.size(); i++){
            TEMP.arr[i] = src.arr[i] + src2.arr[i];
        }
        return TEMP;
    };

    friend Vector operator *(Vector &src, const int x) {
        Vector TEMP = src;
        for (int i = 0;  i < src.size(); i++){
            TEMP.arr[i] = src.arr[i] *x;
        }
        return TEMP;
        };

};


int main() {

  double data1[] = {3.4, 4.4, 6.0};
  Vector v(sizeof(data1)/sizeof(double), data1);
  assert(v == v);
  assert(v + v == v * 2);


};

1 Ответ

3 голосов
/ 10 ноября 2019

Вы объявляете тип параметра operator == как lvalue ссылку на неконстантный. Но и operator +, и operator * возвращают по значению, то, что они возвращают, являются значениями;который не может быть привязан к lvalue-ссылке на non-const.

Вы можете изменить тип параметра operator== на lvalue-ссылку на const, который может связываться с rvalue. (И они не должны быть lvalue ссылкой на non-const , потому что operator== не должен выполнять модификацию.) Например,

friend bool operator ==(const Vector &src, const Vector &src2) {
    ...
}
...