学习表达式模板。
在 Wandevoode 和 Jossutis 的书 Templates, the complete guide 中,18.2.3 The Operators 部分,他们定义了一个带有两个参数的 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;
};
我得到一个二进制“operator+”参数太多。
最佳答案
您的“二进制”operator +
成员函数给您“太多参数”错误,因为它具有三个参数:x
和 y
您指定的,加上隐式的 this
参数。这意味着它实际上需要三个参数,这当然是不可能的。
您可以使成员函数接受一个显式参数和隐式this
,但在许多人看来,这些二元运算符(如加法和减法)最好在类之外实现,在与类相同的命名空间,作为带有两个显式参数的自由函数。如果可以公开访问完成操作所需的数据(否则您必须使用 friend
,如果确实需要的话也可以),这尤其有效。
关于c++ - Wandevoorde&Jossutis 书中带有两个参数的非友元运算符+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642734/