从 std::ostream 重载 << 运算符时,为什么编译器会给出 "too many parameters for this operator function" 错误?
When overloading the << operator from std::ostream, why does the compiler give a "too many parameters for this operator function" error?
我有一个表示二维列向量的结构。我已经重载了一些运算符,例如 * 表示在 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 关键字,我会得到 "too many parameters for this operator function"。这是什么意思,为什么 friend 关键字会修复它?
对于friend
,运算符不是class的成员,因此需要2个输入参数。
如果没有 friend
,运算符将成为 class 的成员,因此只需要 1 个参数,因此您需要删除 vector2d
参数并使用隐藏的this
参数代替。
我有一个表示二维列向量的结构。我已经重载了一些运算符,例如 * 表示在 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 关键字,我会得到 "too many parameters for this operator function"。这是什么意思,为什么 friend 关键字会修复它?
对于friend
,运算符不是class的成员,因此需要2个输入参数。
如果没有 friend
,运算符将成为 class 的成员,因此只需要 1 个参数,因此您需要删除 vector2d
参数并使用隐藏的this
参数代替。