运算符过载<<

码:

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

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

错误:`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&操作系统和BmvMessage const& BM。

您不能将流操作符定义为成员,因为第一个参数需要是流类。 相反,您将它们定义为免费功能,如果需要可能会有兴趣。

链接地址: http://www.djcxy.com/p/73101.html

上一篇: operator overload <<

下一篇: How to properly overload the << operator for an ostream?