代码:
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 );`
答案 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 this
,std::ostream&
os和BmvMessage const&
bm。
您不能将流操作符定义为成员,因为第一个参数需要是流类。相反,您可以将它们定义为自由函数,如果需要可能还可以使用。