我正在研究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;
}
所以...知道我能做些什么吗?
答案 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
(这可能不是一个好主意);否则,
第一个版本仍然无法调用。如果有,例如,
从int
到Vector2D
的隐式转换,您可以调用
+=
在非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
(一个在您的问题中)T
为float
,则int
将正常工作,除非您执行一些有趣的操作,例如从Vector2D
给出一个隐式构造函数单int
,使转换选择模糊不清