从std :: ostream重载<<操作符时,为什么编译器会给出“此操作符函数的参数过多”错误?

时间:2018-07-12 22:00:00

标签: c++ operator-overloading cout ostream

我有一个表示2d列向量的结构。我已经重载了一些运算符,例如*在int上下文中表示标量乘法,而+在另一个矢量上下文中表示矢量加法。

我还想重载<<操作符,以便我可以简单地将对象传递给cout并打印两个元素。目前,我正在像下面这样超载;

struct vector2d
{
private:
    float x;
    float y;
public:
    vector2d(float x, float y) : x(x), y(x) {}
    vector2d() : x(0), y(0) {}


    vector2d operator+(const vector2d& other)
    {
        this->x = this->x + other.x;
        this->y = this->y + other.y;
        return *this;
    }

    vector2d operator*(const int& c)
    {
        this->x = this->x*c;
        this->y = this->y*c;
        return *this;
    }

    friend std::ostream& operator<<(std::ostream& out, const vector2d& other)
    {
        out << other.x << " : " << other.y;
        return out;
    }
};

这很好用,但是如果我删除了Friend关键字,我将得到“此操作符函数的参数太多”。这是什么意思,为什么friend关键字可以解决该问题?

1 个答案:

答案 0 :(得分:1)

对于friend,运算符不是该类的成员,因此它需要2个输入参数。

如果没有friend,运算符将成为该类的成员,因此仅需要1个参数,因此您需要删除vector2d参数并使用隐藏的this参数代替。