gpt4 book ai didi

C++: vector - "operator -"的不明确重载

转载 作者:行者123 更新时间:2023-11-28 00:18:33 25 4
gpt4 key购买 nike

我含糊地重载了我的 vector (数学)类的成员函数 operator-

我可以解决这个问题吗?目前我对如何进行有点困惑。

代码:

class vector
{
double mx, my;

// Constructor not written for clarity

vector operator-() const;
friend vector operator-(vector &lhs, vector &rhs);

}

vector vector::operator-() const
{
return vector(-mx, -my);
}

vector operator-(vector &lhs, vector &rhs) const // Note const here!
{
return vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
}

如果您需要知道构造函数是什么,它就是预期的:

vector::vector(double x, double y)
{
mx = x; my = y;
}

出现问题的代码行是:

vector a(0.0, 0.0);
vector b(0.0, 0.0);
vector c = a - b;

这应该是足够的信息来详细描述问题。还有一个默认拷贝 operator=

问题当然是编译器不知道我是想减去这些 vector 还是取反,然后由于 vector c = vector vectorvector 而得到编译器错误c = a b 如果你愿意的话,这是无意义的代码。

编辑:我错过了一条非常重要的信息,我现在意识到它可以解释问题:

有问题的代码行出现在参数作为常量引用传递的函数中。

void function(const vector &a, const vector &b)
{
vector a(0.0, 0.0);
vector b(0.0, 0.0);
vector c = a - b;
}

这不是特别的问题,但是我上面写的函数实际上应该是用于 operator-= 的。然后根据 operator-= 定义 operator-(减法)。所以要充分解释,这就是问题所在:

vector& vector::operator-=(const Vector3& rhs)
{
m_x -= rhs.m_x;
m_y -= rhs.m_y;
return *this;
}

vector operator-(vector &lhs, vector &rhs)
{
lhs -= rhs;
return lhs;
}

这解释了问题 - 函数 operator-(否定) promise 不会通过使用 const 修改成员,并且定义了另外 2 个用于减法的运算符就彼此而言。我认为解决方案是执行以下操作:

vector operator-(vector &lhs, const vector &rhs)
{
vector v = lhs;
v -= rhs;
return lhs;
}

或者如果不是那样,那么也许是更详细的方法:

vector operator-(const vector &lhs, const vector &rhs)
{
vector v = vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
return v;
}

我现在要测试一下 - 我现在有点头疼,所以我想我一定没有 100% 清楚地思考。

编辑:现在可以使用了,只需将减法运算符修改为友元函数即可。

最佳答案

你应该定义 operator-

vector operator-(const vector &lhs, const vector &rhs)
{
return vector(lhs.mx - lhs.my, rhs.mx - rhs.my);
}

编译器尝试使用一元 operator-,因为它适用于 const vector 。

当您编写 vector c = a - b; 并且 a 和 b 是 const vector 时,编译器会查找它没有找到的上述函数。它只会找到一个没有常量参数的运算符。由于您不修改参数,因此将它们定义为 const。

您在其后添加的 const 关键字无效。它应该只与方法一起出现,并指定该对象不被该方法修改。编译器应该通过函数定义来提示它的存在。

关于C++: vector - "operator -"的不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28744608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com