如何使用+ =运算符实现标量和向量加法?

时间:2013-03-15 09:33:56

标签: c++ operator-overloading vector-graphics

我正在研究Vector2D类,我认为使用+ = / +运算符实现向量加法和标量加法都是有意义的。

麻烦的是,我真的不知道如何解决这个明显的争论歧义,这就是Clang所说的:

vector2d_test.cpp:17:16: error: use of overloaded operator
      '+=' is ambiguous (with operand types 'Vector2D<float>' and 'int')
        vector += 1;
        ~~~~~~ ^  ~~~~~~~
vector2d.hpp:34:18: note: candidate function
    Vector2D<T>& operator+=(const Vector2D<T>& other)
                 ^
vector2d.hpp:41:18: note: candidate function
    Vector2D<T>& operator+=(const T summand) const

以下是两个功能:

Vector2D<T>& operator+=(const Vector2D<T>& other)
{
    x += other.x;
    y += other.y;
    return *this;
}

template <typename S>
Vector2D<T>& operator+=(const S summand) const
{
    x += summand;
    y += summand;
    return *this;
}

所以...知道我能做些什么吗?

3 个答案:

答案 0 :(得分:2)

您已写入错误消息。您试图添加到int类型的向量变量,但您的向量具有浮点数。它应该是:

vector += 1f;

vector += 1.0;

看一看。当你有这个载体时:

Vector2D<float> vector;
与此向量对应的

函数具有标题:

Vector2D<T>& operator+=(const float summand) const;

现在第二个并不重要。当你尝试添加到向量1时,你试图调用函数:

Vector2D<T>& operator+=(const int summand) const;

你没有申报。这就是编译器给你发错的原因 - 它找不到合适的功能。

答案 1 :(得分:1)

目前尚不清楚你要做什么。 operator+= 您发布的功能不合法,除非他们是会员。而如果 他们是成员,你有类似的东西:

Vector2D<float> v;
//   ...
v += 1;

Vector2D<float>::operator+=( Vector2D<float> const& ) 函数不可调用,因此不存在歧义。如果 这些函数不是成员,那么应该写成:

template <typename T>
Vector2D<T>& operator+=( Vector2D<T>& lhs, Vector2D<T> const& rhs );
template <typename T, typename U>
Vector2D<T>& operator+=( Vector2D<T>& lhs, U rhs );

即使在这种情况下,也不能使用rhs来调用第一个 输入int,因此没有歧义。

编辑:

我在帖子的第二行结束时错过了const。 这是你自己的一个明显错字,它仍然没有改变 任何事情,除非你也有一些隐含的转换 Vector2D(这可能不是一个好主意);否则, 第一个版本仍然无法调用。如果有,例如, 从intVector2D的隐式转换,您可以调用 +=在非const Vector2D上,然后是第一个重载 一个更好的匹配隐含的第一个参数(导致 this指针,因为它是完全匹配,没有偶数 一个简历转换,但第二个功能是更好的匹配 第二个参数,因为模板实例化结果 完全匹配。所以这个电话很模糊。

答案 2 :(得分:0)

最简单的方法是在Vector2D ala中定义函数:

Vector2D& operator+=(const Vector2D& rhs)
    { ...each this element += rhs's corresponding element... }

Vector2D& operator+=(const T& summand)
    { ...each this elements += summand... }

friend Vector2D operator+(Vector2D lhs, const Vector2D& rhs) { return lhs += rhs; }

friend Vector2D operator+(Vector2D lhs, const T& rhs) { return lhs += rhs; }

注意:

  • 非成员函数是friend s,允许以内联方便地定义它们
  • 这些功能不应该是const(一个在您的问题中)
  • 将尝试进行常规转换,因此,如果Tfloat,则int将正常工作,除非您执行一些有趣的操作,例如从Vector2D给出一个隐式构造函数单int,使转换选择模糊不清