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


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

最佳答案

目前尚不清楚您要做什么。 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的隐式转换,您调用
在非常量Vector2D上的+=,则第一个重载是
更好地匹配隐式第一个参数(这导致
this指针),因为它是完全匹配的,甚至没有
cv转换,但第二个功能更适合
第二个参数,因为模板实例化结果
完全匹配因此,通话是不明确的。

08-28 19:09