学习表达式模板。
在Wandevoode和Jossutis的书模板,完整指南, 18.2.3运营商部分,他们定义了一个带有两个参数的operator+
但不是friend
方法。
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()));
}
我是初学者,因此对我对C ++的了解不安全。
这个operator+
不应该是friend
吗?
我试过
class A{
public:
explicit A(int x) : a(x){};
A& operator+(const A& x, const A& y){
A temp{x.a + y.a};
return temp;
};
private:
int a;
};
我正在使用二进制&#39;运算符+&#39;参数太多。
答案 0 :(得分:1)
你的&#34;二进制&#34; operator +
成员函数为您提供了太多参数&#34;错误,因为它有三个参数:您指定的x
和y
,以及隐式this
参数。这意味着它实际上需要三个参数,这当然是不可能的。
你可以使一个成员函数采用一个显式参数和隐式this
,但是在许多人看来,这些二元运算符如加法和减法更好地在类外部实现,在同一名称空间中该类,作为带有两个显式参数的自由函数。如果可以公开访问完成操作所需的数据,那么这种方法尤其有效(否则您必须使用friend
,如果真的有必要,这是正常的。)
答案 1 :(得分:0)
总结下一位读者。
似乎有三种形式的重载二进制算术运算符。
首先:通过const
引用获取一个参数的成员方法。使用const
返回值(根据this reference)以避免(x+y)=z
。
class A{
const A operator+(const A& other){
// ...
};
};
第二个:一个朋友方法,因此包含在类的定义中,有两个参数。
class A{
friend A& operator+(const A& operand1, const A& operand2){
// ...
};
};
第三:采用两个参数的非成员方法。
class A{
// ...
};
A operator+(const A& operand1, const A& operand2){
// ...
};