【问题标题】:C++: Vector - Ambiguous overload of "operator -"C ++:向量-“运算符-”的模棱两可的重载
【发布时间】:2015-02-26 14:09:30
【问题描述】:

我模棱两可地重载了我的向量(数学)类的成员函数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 c = vector vectorvector c = a b(如果您愿意)而出现编译器错误,这是无意义的代码。

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

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

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-(否定)承诺不会通过使用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% 清楚地思考。

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

【问题讨论】:

  • 这不应该是模棱两可的......
  • Borgleader 是对的。你有什么错误吗?
  • I can't repro your error你能提供一个最小的例子吗?
  • 嗯,好的,让我再检查一下我的代码...
  • 顺便说一句,缺少const

标签: c++ vector operator-overloading subtraction negation


【解决方案1】:

您应该将operator- 定义为

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多