C++ C++;重载+;运算符导致错误

C++ C++;重载+;运算符导致错误,c++,C++,我已尝试为我的类重载“+”运算符: Vector operator+( const Vector& a, const Vector& b ); 然而,它告诉我: vector.h(12): error C2804: binary 'operator +' has too many parameters 我真的不明白。请帮助我如果在类中定义运算符,它应该只接收1个参数 class Vector { ... Vector operator+ (const Vector&a

我已尝试为我的类重载“+”运算符:

Vector operator+( const Vector& a, const Vector& b );
然而,它告诉我:

vector.h(12): error C2804: binary 'operator +' has too many parameters

我真的不明白。请帮助我

如果在类中定义运算符,它应该只接收1个参数

class Vector {
  ...
  Vector operator+ (const Vector& other) const {
    Vector res = *this;
    res += other;
    return res;
  }
  ...
};
如果在类定义之外定义2参数,则使用2参数版本

class Vector {
 ...
};

Vector operator+ (const Vector& first, const Vector& second) {
  Vector res = first;
  res += second;
  return res;
}

我猜您是将代码放在类中,如果是这样,您只需要给出一个参数(另一个对象),因为默认情况下,
这个
对象位于左侧

我相信您已将其声明为类
Vector
的成员方法。在这种情况下,它应该只接受一个参数,因为调用此运算符的对象可以通过
指针隐式使用。或者,您可以将函数声明为类
Vector
友元
,并为其获取两个参数。

这是因为运算符左侧的向量和右侧的向量不是第一个和第二个参数。
+
前面的一个实际上是
这个
,它是作为
向量*
自动提供的。您只需要一个参数,即
+
运算符右侧的向量

这是正确的:

Vector operator+( const Vector& b );
您可以通过以下方式访问左向量:

(* this)
b
。。。右向量是:

(* this)
b

重载+运算符时,只能有一个参数。 另一个参数是“this”

跟随KennyTM,或者让您成为
朋友

友元向量操作符+(常量向量&a,常量向量&b)


可以找到一个例子。

具体的错误已经在一些答案中得到了回答。成员方法为单参数,自由函数版本为两个参数。但是没有提示您应该遵循什么路径:您应该删除第一个参数还是让它成为一个自由函数

常见的习惯用法是,如果您提供
operator+
,您可能还希望提供
operator+=
,如果您同时提供这两个,您可以根据后者实现第一个。将
operator+=
作为成员函数(完全访问所有状态)实施,将
operator+
作为自由函数实施,只需使用公共
operator+=

class MyClass {
public:
   MyClass& operator+=( MyClass const & rhs );
};
MyClass operator+( MyClass lhs, MyClass const & rhs ) {
   return lhs+=rhs;
}

这样,您的操作只有一个实现,您可以同时提供两个接口(
a+b
a+=b
),因此您的接口更加丰富,几乎不需要任何成本。

对于第二种情况,如果不是手动复制第一个参数,而是使用“按值传递”,则如果第一个参数是临时参数,编译器有机会优化复制。在
向量运算符+(向量第一,向量常数和第二);向量foo()。。。a=foo()+b编译器知道
foo()
调用的结果是要销毁的临时绑定,因此它可以对代码进行排列,以便将其构建在
运算符+
的第一个参数的位置,并删除副本。使用您建议的签名,编译器无法避免复制对象。创建自由函数的原因是什么?通常将
操作符+
声明为类方法不是更好吗?@sje397:自由函数操作符相对于数据类型是对称的,而成员方法不能是对称的。考虑可以从类型<代码> T2隐式转换的类型<代码> >代码>,以及从这些类型中两个对象<代码>代码>代码>代码> > T2<代码>。如果
T
有一个成员方法
operator+
,则
T+t2
格式正确,将调用该运算符,但
t2+T
将是编译时错误。在自由函数实现中,这两个操作都是允许的,并且具有完全相同的含义——这是人们从加法中假定的……编译器在调用
T
的成员方法之前,不允许将
t2
转换为
T
,但是允许执行该转换以匹配函数/方法的参数,如
t+t2
@sje397所示。干净的代码意味着简短的类定义试图遵循单一责任原则(一个类应该做很少的事情,但是做得很好)。如果将代数运算符的定义添加到类向量中会导致类定义变长,那么。。。然后您应该将其声明为非成员函数。@sje397 cf第44章。“在Bjarne Stroustrup的C++中,在深度系列中C++编写代码标准更喜欢编写非成员非好友函数:101个规则,指南,以及HEB和StutTrice的最佳实践,您的操作员是一个类的成员函数?如果是,请在问题中添加类别声明。