C++ 非友元运算符+;在Wandevoorde&;约瑟蒂斯';书

C++ 非友元运算符+;在Wandevoorde&;约瑟蒂斯';书,c++,operator-overloading,friend,C++,Operator Overloading,Friend,学习表达模板 在Wandevode和Jossutis的书籍模板《完整指南》第18.2.3节“运算符”中,它们定义了一个带有两个参数的运算符+,但不是作为友元方法 template <typename T, typename R1, typename R2> Array<T,A_Add<T,R1,R2> > operator+ (Array<T,R1> const& a, Array<T,R2> const& b) {

学习表达模板

在Wandevode和Jossutis的书籍模板《完整指南》第18.2.3节“运算符”中,它们定义了一个带有两个参数的
运算符+
,但不是作为
友元
方法

template <typename T, typename R1, typename R2>
Array<T,A_Add<T,R1,R2> >
operator+ (Array<T,R1> const& a, Array<T,R2> const& b) {
    return Array<T,A_Add<T,R1,R2> >
           (A_Add<T,R1,R2>(a.rep(),b.rep()));
}

我得到一个二进制“运算符+”的参数太多。

为下一位读者总结一下

class A{
  friend A& operator+(const A& operand1, const A& operand2){
    // ... 
  };
};
class A{
  // ...
};

A operator+(const A& operand1, const A& operand2){
   // ...
};
重载二进制算术运算符似乎有三种形式

First:通过
const
引用获取一个参数的成员方法。返回值的
const
用于(根据)避免
(x+y)=z

class A{
  const A operator+(const A& other){
    // ... 
  };
};
Second:友元方法,因此包含在类的定义中,使用两个参数

class A{
  friend A& operator+(const A& operand1, const A& operand2){
    // ... 
  };
};
class A{
  // ...
};

A operator+(const A& operand1, const A& operand2){
   // ...
};
第三种:采用两个参数的非成员方法

class A{
  friend A& operator+(const A& operand1, const A& operand2){
    // ... 
  };
};
class A{
  // ...
};

A operator+(const A& operand1, const A& operand2){
   // ...
};
“binary”
运算符+
成员函数会出现“参数过多”错误,因为它有三个参数:指定的
x
y
,加上隐式
参数。这意味着它实际上需要三个参数,这当然是不可能的


您可以使成员函数使用一个显式参数,而隐式的
this
,但在许多人看来,这些二进制运算符(如add和subtract)更好地在类之外实现,与类位于同一命名空间中,作为使用两个显式参数的自由函数。如果可以公开访问完成操作所需的数据(否则必须使用
friend
,如果确实需要,这是可以的)。

如果不访问任何非公开成员,则不必这样做。如果此函数访问私有或受保护的数据,则可能是friend。否则它自己就可以了。我明白了。我想我已经有了这样的想法,
A+B
operator+
是成员方法时,或者当它是朋友时,
operator+(A,B)
会调用
A.operator+(B)
。因此,它也有意义。
A.operator+(A,B)
@Karene:No,
A.operator+(A,B)
没有意义
A+B
如果是非会员,无论是否是朋友,都可以呼叫
操作员+(A,B)
。作为朋友,它可以访问私人成员,这在这里是不需要的。@MikeSeymour我一直收到一个“参数太多”错误。如果在VisualStudio中使用VisualC++有什么区别的话。