我知道这个问题在这里和互联网上出现过很多次,但是即使在这个网站上搜索,我也不能在myVector类中重载+运算符。 奇怪的是,我可以重载“=”运算符,但当我编写运算符“+”的声明和定义时,我得到了一个错误。
更具体地说,我将操作符声明为
myvec(&S; 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;
}
在下面我的小课堂上:
#include <iostream>
#include <stdio.h>
#include <math.h>
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.cp.cc:77:59:error:'myvec&myvec::operator+(const myvec&;,const myvec&;)‘必须采用零个或一个参数”
它清楚地引用了+运算符的定义。 如何修复它以使操作员超载?
将重载运算符移出MyVec
类。 也不要返回对局部变量的引用,将返回类型更改为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+
接受两个参数,如果您在类中声明它,并给它两个常规参数,那么您就得到了一个接受三个参数的operator+
,这是不允许的。
要获得全面的建议,请看这里
编译员已经给了你答案:“必须取零或一个参数”。
声明应该是myvec运算符+(常量myvec&;);
,并且在定义中使用如下
:
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;
}
并且不返回对本地对象的引用。