操作员过载<<

operator overload <<

本文关键字:lt 操作员      更新时间:2023-10-16

代码:

std::ostream& operator<<(std::ostream& os, const BmvMessage& bm);

我没有看到任何不正确的地方,但它给出了以下错误:

error: 'std::ostream& BMV::BmvMessage::

operator<<(std::ostream&, const BMV::BmvMessage&(' 必须只接受一个参数。

我不知道为什么会这样。欢迎任何建议。我以前这样做过,但从未遇到过此错误。我也在网上检查过,看起来像:

ostream& operator<< (ostream& out, char c );`

operator<<带到类外,使其成为一个自由函数。如果类需要访问private部分,请使其成为类的friend

运算符

必须是自由函数,因为它的第一个参数与类的类型不同。通常,当您重载二元运算符Foo时,成员函数版本只接受单个参数,FOO(a, b)表示a.Foo(b)

由于a << b会调用a.operator<<(b),但a是流,这对我们来说是没有用的。

所以做一个免费函数,或者做一个免费的好友函数。具有公共toString成员函数有助于:

class Foo {
public:
  std::string toString() const;
  // ...
};
std::ostream & operator<<(std::ostream & o, const Foo & x) {
  return o << x.toString(); 
}

您正在使用自由格式签名来定义成员函数。成员函数具有隐式this参数,因此在您的情况下,您的成员函数尝试重载operator <<将导致函数接受 3 个参数:隐式thisstd::ostream& OS 和 BmvMessage const& BM。

不能将流式处理运算符定义为成员,因为第一个参数必须是流类。相反,您可以将它们定义为自由函数,如果需要,可能会成为好友。