我正在研究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
(这可能不是一个好主意);否则,第一个版本仍然无法调用。例如,如果有
从
int
到Vector2D
的隐式转换,您调用在非常量Vector2D上的
+=
,则第一个重载是更好地匹配隐式第一个参数(这导致
this
指针),因为它是完全匹配的,甚至没有cv转换,但第二个功能更适合
第二个参数,因为模板实例化结果
完全匹配因此,通话是不明确的。