c++ - Wandevoorde&Jossutis 书中带有两个参数的非友元运算符+

标签 c++ operator-overloading friend

学习表达式模板

在 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 + 成员函数给您“太多参数”错误,因为它具有三个参数:xy 您指定的,加上隐式的 this 参数。这意味着它实际上需要三个参数,这当然是不可能的。

您可以使成员函数接受一个显式参数和隐式this,但在许多人看来,这些二元运算符(如加法和减法)最好在类之外实现,在与类相同的命名空间,作为带有两个显式参数的自由函数。如果可以公开访问完成操作所需的数据(否则您必须使用 friend,如果确实需要的话也可以),这尤其有效。

关于c++ - Wandevoorde&Jossutis 书中带有两个参数的非友元运算符+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642734/

相关文章:

c++ - 为什么 cin 会在输入无效的情况下将对应的 int 变量更改为零?

C++ 二进制文件在 Windows XP 上不起作用

c++通过引用将映射传递给函数

c# - 是否可以在具有运算符重载的结构上抑制从 null 的隐式转换?

operator-overloading - 添加新的赋值运算符

c++ - 使用 OpenMP 并行化 C++ 代码不会提高性能

c++ - 如何重载 I/O 运算符 C++

scala - Scala 中的好友访问

c++ - 一个 'friend of a Class' 的函数允许 'read access' 到它的 'private members' 但不是 'write access' ?

c++ - 内部类私有(private)成员访问和封闭的友好性