C++ 如何使用+;=操作人员
我正在研究Vector2D类,我认为向量加法和标量加法都可以用+=/+运算符实现 问题是,我真的不知道如何解决这个明显的论点歧义,下面是Clang说的:C++ 如何使用+;=操作人员,c++,operator-overloading,vector-graphics,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_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\u test.cpp:17:16:错误:使用重载运算符
“+=”不明确(操作数类型为“Vector2D”和“int”)
向量+=1;
~~~~~~ ^ ~~~~~~~
vector2d.hpp:34:18:注:候选函数
向量2D和运算符+=(常量向量2D和其他)
^
vector2d.hpp:41:18:注:候选函数
向量2D和运算符+=(常数T求和)常数
以下是两个功能:
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;
}
Vector2D和运算符+=(常量Vector2D和其他)
{
x+=其他.x;
y+=其他。y;
归还*这个;
}
模板
向量2D和运算符+=(常数S和)常数
{
x+=和;
y+=和;
归还*这个;
}
所以。。。知道我能做些什么吗?你们都在错误信息中写了。您试图添加int类型的向量变量,但向量有浮点数。应该是:
vector += 1f;
或
看一看。当你有这个向量时:
Vector2D<float> vector;
Vector2D向量;
与此向量对应的函数具有标头:
Vector2D<T>& operator+=(const float summand) const;
Vector2D&operator+=(常量浮点和)常量;
第二个现在不重要了。当您尝试添加到向量1时,您正在尝试调用函数:
Vector2D<T>& operator+=(const int summand) const;
Vector2D&operator+=(const int summand)const;
你没有申报。这就是编译器向您发送错误消息的原因—它找不到正确的函数。您已经在错误消息中写入了所有代码。您试图添加int类型的向量变量,但向量有浮点数。应该是:
vector += 1f;
或
看一看。当你有这个向量时:
Vector2D<float> vector;
Vector2D向量;
与此向量对应的函数具有标头:
Vector2D<T>& operator+=(const float summand) const;
Vector2D&operator+=(常量浮点和)常量;
第二个现在不重要了。当您尝试添加到向量1时,您正在尝试调用函数:
Vector2D<T>& operator+=(const int summand) const;
Vector2D&operator+=(const int summand)const;
你没有申报。这就是编译器向您发送错误消息的原因-它找不到正确的函数。最简单的方法是在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; }
注:
- 非成员函数是
s,这使得它们可以方便地内联定义friend
- 函数不应该是常量(你的问题中有一个)
- 将尝试进行常规转换,因此如果
为T
,则float
s将正常工作,除非您执行一些有趣的操作,例如从单个int
中给出一个隐式构造函数,从而使转换的选择不明确int
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; }
注:
- 非成员函数是
s,这使得它们可以方便地内联定义friend
- 函数不应该是常量(你的问题中有一个)
- 将尝试进行常规转换,因此如果
为T
,则float
s将正常工作,除非您执行一些有趣的操作,例如从单个int
中给出一个隐式构造函数,从而使转换的选择不明确int
运算符+=
你发布的功能不合法,除非它们是成员。如果
他们是会员,你有类似的东西:
Vector2D<float> v;
// ...
v += 1;
vector2dv;
// ...
v+=1;
Vector2D::operator+=(Vector2D常量&)
函数是不可调用的,因此不存在歧义。如果
函数不是成员,那么它们应该被写入:
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 );
模板
向量2D和运算符+=(向量2D和lhs,向量2D常量和rhs);
模板
Vector2D和运算符+=(Vector2D和lhs,U-rhs);
即使在这种情况下,也不能使用的rhs
调用第一个
键入int
,因此没有歧义
编辑:
我错过了你发帖的第二个结尾处的常量。
这是你的一个明显的打字错误,它仍然没有改变
任何东西,除非你也有一些隐式转换到
Vector2D
(这可能不是个好主意);否则
第一个版本仍然不可调用。例如,如果有,
从int
到Vector2D
的隐式转换,然后调用
+=
在非常量向量2D上,则第一个重载为
更好地匹配隐式第一个参数(这将导致
这个
指针),因为它是一个精确匹配,甚至没有
cv转换,但第二个函数更适合
第二个参数,因为模板实例化的结果
完全匹配。所以这个电话是不明确的。不清楚你想做什么。运算符+=
你发布的功能不合法,除非它们是成员。如果
他们是会员,你有类似的东西:
Vector2D<float> v;
// ...
v += 1;
vector2dv;
// ...
v+=1;
Vector2D::operator+=(Vector2D常量&)
函数是不可调用的,因此不存在歧义。如果
函数不是成员,那么它们应该被写入:
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 );
模板
向量2D和运算符+=(向量2D和lhs,向量2D常量和rhs);
模板
Vector2D和运算符+=(Vector2D和lhs,U-rhs);
即使在这种情况下,也不能使用的rhs
调用第一个
键入int
,因此没有歧义
编辑:
我错过了你发帖的第二个结尾处的常量。
这是你的一个明显的打字错误,它仍然没有改变
任何东西,除非你也有一些隐式转换到
Vector2D
(这可能不是个好主意);否则
第一个版本仍然不是callab