操作员过载<<
operator overload <<
代码:
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 个参数:隐式this
、std::ostream&
OS 和 BmvMessage const&
BM。
不能将流式处理运算符定义为成员,因为第一个参数必须是流类。相反,您可以将它们定义为自由函数,如果需要,可能会成为好友。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 模板操作员&lt;未打电话
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 左角支架解释为操作员&lt;而不是模板参数
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- &lt;&lt;&lt;的这些超载有什么区别操作员
- (C 14)操作员&lt;&lt;超负荷无法正如智能指针向量所预期的那样工作
- 带有GMP的CodeBlocks,segfault with&lt;&lt;操作员和MP*_Class
- &lt;&lt;操作员在C 中超载错误
- Visual C 构建器图案插入操作员`&lt;&lt;`样式
- 超载&LT的正确方法;操作员
- 在尝试超载&lt;&lt;时链接错误2005和1169操作员
- C++标准::cout和<<操作员,优先级