运算符重载<<

时间:2011-11-16 18:49:01

标签: c++ operator-overloading

代码:

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

我没有看到任何错误,但它会出现以下错误:

  

错误:`std :: ostream&amp; BMV :: BmvMessage :: operator&lt;&lt;(std :: ostream&amp;,const BMV :: BmvMessage&amp;)'必须只有一个参数。

我不知道为什么会这样。欢迎任何建议。我以前做过这个,从来没有遇到过这个错误。我也在线检查了它,看起来像:

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

3 个答案:

答案 0 :(得分:3)

在课堂外取operator<<,使其成为免费功能。如果需要访问friend个部分,请将其设为private

答案 1 :(得分:3)

运算符必须是 free 函数,因为它的第一个参数与您的类的类型不同。通常,当重载二元运算符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(); 
}

答案 2 :(得分:1)

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

您不能将流操作符定义为成员,因为第一个参数需要是流类。相反,您可以将它们定义为自由函数,如果需要可能还可以使用。