这是我的一段代码,它解决了微分方程组。
Vector dydx(Neq);
void DiffEq(Vector x, Vector &dydx)
{
dydx(0) = x(1);
dydx(1) = -x(0);
}
double MidPoint(int n, Vector x)
{
double h=H/n;
Matrix z(n+1,n+1);
z.fillRow(0,x);
DiffEq(x, dydx);
z.fillRow(1,AddVec(x, dydx*h)); //Error: Invalid use of void expression
for (int j=1; j<n; j++)
{
DiffEq(z.getRow(j), dydx);
z.fillRow(j+1, AddVec(z.getRow(j-1), dydx*h*2)); //error: void value not ignored as it ought to be
}
DiffEq(z.getRow(n), dydx);
return 0.5*AddVec(z.getRow(n), z.getRow(n-1), dydx*h); //Error: Invalid use of void expression
}
Vector和Matrix类是自定义的。这是Vector
class Vector
{
public:
Vector(size_t size): vSize(size), vData(size){}
int getSize(){return vSize;}
double& operator()(size_t i){return vData[i];}
double operator()(size_t i) const {return vData[i];}
void operator+(double d) // These only overload the Vector + int operator
{
for (int i=0; i<vSize; i++) {vData[i]=vData[i]+d;}
}
void operator*(double d)
{
for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;}
}
size_t vSize;
vector<double> vData;
};
使用功能
Vector AddVec(Vector v1, Vector v2)
{
Vector totVec(v1.getSize());
for (int i=0; i<v1.getSize(); i++) {totVec(i) = v1(i) + v2(i);}
return totVec;
}
3个载体的功能相同。
现在我意识到错误意味着我将void传递给某个函数,但我无法弄清楚哪里出错了。当我尝试编写测试程序时,一切似乎都能正常工作。
答案 0 :(得分:3)
您的运营商返回无效
void operator+(double d) // These only overload the Vector + int
{
for (int i=0; i<vSize; i++) {vData[i]=vData[i]+d;}
}
void operator*(double d)
{
for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;}
}
因此,当您致电AddVec(x, dydx*h)
时,它会调用AddVec(x, void)
答案 1 :(得分:1)
你重载的操作符不像传统的操作符,不要那样做!这样做会给C ++带来坏名声。
void operator*(double d)
{
for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;}
}
这不会返回任何内容,因此您不能像这样使用它:
z.fillRow(1,AddVec(x, dydx*h));
^^^^^^
operator*
应该返回一个新对象,而不是修改它的左操作数。如果要修改左操作数,请使用operator*=
,但仍应返回一些内容。
Vector& operator*=(double d)
{
for (int i=0; i<vSize; i++)
vData[i] *= d;
return *this;
}
Vector operator*(double d)
{
Vector v(*this);
v *= d;
return v;
}
作为非成员,operator*
会更好,并且应该通过引用来论证:
Vector operator*(const Vector& v, double d)
{
Vector v2(v);
v2 *= d;
return v2;
}