在 myVector class 中重载运算符 + 时出错

Error while overloading operator + in myVector class

我知道这个问题在这里和互联网上出现过很多次,但即使在这个网站上搜索我也无法在 myvec class 中重载 + 运算符.奇怪的是,我可以重载 = 运算符,但是当我编写运算符 + 的声明和定义时,出现错误。

更具体地说,我将运算符声明为

myvec& myvec::operator+(const myvec& v, const myvec& w)

定义为

myvec& myvec::operator +(const myvec& v, const myvec& w)
{
    int d = v.size();
    myvec x(d);
    for (int i = 0; i < d; i++) {
        x(i) = v(i)+w(i);
    }
    return x;
}

下面是我的小class:

#include <iostream>
#include <cmath>

using namespace std;

class myvec {
private:
    int dimension;
    double* data;

public:
    myvec(int dim);
    myvec(const myvec& v);
    ~myvec();

    int size() const;
    void Print();
    double& operator ()(int i);
    myvec& operator =(const myvec& v);
    myvec& operator +(const myvec& v, const myvec& w);
};


myvec::myvec(int dim)
{
    dimension = dim;
    data = new double[dim];

    for (int i = 0; i < dimension; i++) {
        data[i] = 0.0;
    }
}

myvec::myvec(const myvec& v)
{
    int dimensione = v.size();
    data = new double[dimensione];
    for (int i = 0; i < dimensione; i++) {
        data[i] = v.data[i];
    }
}

myvec::~myvec()
{
    dimension = 0;
    delete[] data;
    data = NULL;
}

int myvec::size() const
{
    return dimension;
}

double& myvec::operator ()(int i)
{
    return data[i];
}

myvec& myvec::operator =(const myvec& v)
{

    int dim  = v.size();
    for (int i = 0; i < dim; ++i) {
        data[i] = v.data[i];
    }
    return *this;
}

myvec& myvec::operator +(const myvec& v, const myvec& w)
{
    int d = v.size();
    myvec x(d);
    for (int i = 0; i < d; i++) {
        x(i) = v(i)+w(i);
    }
    return x;
}

void myvec::Print()
{
    for (int i = 0; i < dimension; i++) {
        cout << data[i]<<endl;
    }
}

编译器给我错误:

testmyvec.cpp.cc:77:59: error: ‘myvec& myvec::operator+(const myvec&, const myvec&)’ must take either zero or one argument

很明显是指+运算符的定义。我该如何修复它以使运算符超载?

将重载运算符移出 myvec class。也不要return引用局部变量,将return类型改为myvec.

class myvec{
    ...
};

myvec operator+(const myvec& v, const myvec& w);

myvec operator+(const myvec& v, const myvec& w) {
    int d = v.size();
    myvec x(d);
    for(int i=0;i<d;i++) {
        x(i)=v(i)+w(i);
    }
    return x;
}

operator+ 接受两个参数,如果你在 class 中声明它并给它两个常规参数,那么你最终得到一个接受三个参数的 operator+ , 这是不允许的。

如需综合建议,请查看here

编译器已经给了你答案:“必须采用零个或一个参数”。

声明应该是 myvec operator+(const myvec&); 并且在定义中你使用 this 像这样:

myvec myvec::operator +(const myvec& w)
{
    int d = v.size();
    myvec x(d);
    for (int i = 0; i < d; i++) {
        x(i) = (*this)(i) + w(i);
    }
    return x;
}

并且不要 return 引用本地对象。