19

按照这个答案中给出的建议,我+在我的简单类中重载了运算符,Point如下所示(+= 重载工作正常)。

Point operator+ (Point p1, const Point& p2)
{
    return std::move(p1 += p2);
}

但我得到一个错误说

重载的 'operator+' 必须是一元或二元运算符(有 3 个参数)

怎么了?

4

3 回答 3

21

听起来您已将运算符声明为成员函数。成员函数采用隐式第一个参数,这意味着您的运算符现在采用三个参数。您可以通过使其成为非成员函数来解决此问题。

在任何情况下,最好将其声明为 non-member,以确保操作的 LHS 和 RHS 之间的对称性。

至于std::move,它在<utility>标题中。虽然我看不到在这里使用它的原因。

于 2012-11-25T18:58:34.110 回答
17

您想要执行以下任一操作:

// Member function, performs (*this + right)
Point operator+ (Point & right)

或者

// Free function, performs (left + right)
Point operator+ (const Point &left, const Point& right)
于 2012-11-25T18:59:40.070 回答
3

您使运算符成为成员函数,这意味着当您包含隐式第一个参数时,它实际上具有三个this参数。

任何一个:

  • 使用*this而不是p1去掉第一个参数,或者
  • 让操作符重载一个自由函数(而不是一个成员)——这是首选。
于 2012-11-25T18:59:45.470 回答