C++ 如何使用+;=操作人员

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类,我认为向量加法和标量加法都可以用+=/+运算符实现

问题是,我真的不知道如何解决这个明显的论点歧义,下面是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\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; }
注:

  • 非成员函数是
    friend
    s,这使得它们可以方便地内联定义
  • 函数不应该是常量(你的问题中有一个)
  • 将尝试进行常规转换,因此如果
    T
    float
    ,则
    int
    s将正常工作,除非您执行一些有趣的操作,例如从单个
    int
    中给出一个隐式构造函数,从而使转换的选择不明确

最简单的方法是定义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,这使得它们可以方便地内联定义
  • 函数不应该是常量(你的问题中有一个)
  • 将尝试进行常规转换,因此如果
    T
    float
    ,则
    int
    s将正常工作,除非您执行一些有趣的操作,例如从单个
    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