0

我正在研究 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;
}

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

4

3 回答 3

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;

你没有声明。这就是编译器向您发送错误消息的原因——它找不到合适的功能。

于 2013-03-15T09:38:10.247 回答
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 );

即使在这种情况下,第一个也不能用rhstype调用int,所以没有歧义。

编辑:

我错过了const您帖子中第二个结尾的那个。这是你的一个明显的错字,它仍然没有改变任何东西,除非你也有一些隐式转换 Vector2D(这可能不是一个好主意);否则,第一个版本仍然不可调用。例如,如果存在从intto的隐式转换Vector2D,并且您调用 +=非常量 Vector2D,则第一个重载与隐式第一个参数(导致this指针)更好匹配,因为它是完全匹配,甚至没有 cv 转换,但第二个函数更适合第二个参数,因为模板实例化会导致完全匹配。所以这个称呼是模棱两可的。

于 2013-03-15T09:56:45.627 回答
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; }

笔记:

  • 非成员函数是friends,这样可以方便地内联定义它们
  • 功能不应该是const(一个在你的问题中)
  • 将尝试通常的转换,所以 if Tis floatthen ints 会正常工作,除非你做一些有趣的事情,比如Vector2D从一个单一的隐式构造函数中给出一个隐式构造函数,int这使得转换的选择变得模棱两可
于 2013-03-15T09:51:40.593 回答