在 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 引用本地对象。
我知道这个问题在这里和互联网上出现过很多次,但即使在这个网站上搜索我也无法在 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 引用本地对象。