覆盖结构上的二进制<<运算符
Override binary << operator on struct
我试图在这样一个简单的结构体上做一个覆盖:
struct Node {
int data1;
int data2;
ostream& operator<<(ostream &o, const Node &n)
{
o << "(a: " << data1 << ", b: " << data2 << ")";
return o;
}
};
我得到:错误C2804: 'operator <<'参数太多
那么,如果我删除第二个参数:
ostream& operator<<(ostream &o)
然后我得到:错误:binary '<<':找不到右操作数类型为'const Node'的操作符
这是怎么回事?
operator<<
需要两个操作数。在两个类型之间定义operator<<
重载函数有两种方法:
-
作为成员函数。这就是
operator<<
超载在std::basic_ostream
和一些基本类型之间的定义。当使用std:cout << 10;
时,它被解析为重载操作符std::basic_ostream<char>::operator<<(int)
定义为成员函数时,操作符的LHS是类的实例。操作符的RHS是函数的实参。这就是为什么当你将它定义为成员函数时,它只能有一个参数。
-
作为自由函数。这就是在
由于这个原因,您必须将std::basic_ostream
和自定义类型之间定义operator<<
重载的方式。这些函数必须有两个参数。第一个实参是操作符的LHS,第二个实参是操作符的RHS。std::ostream
和类之间的operator<<
重载定义为一个自由函数,std::ostream&
作为第一个参数类型,Node const&
作为第二个参数类型。std::ostream& operator<<(std:ostream& os, Node const& node);
template <typename T>
std::ostream& operator<<(std::ostream& os, T const& t)
{
return t.serialize(os);
}
那么,任何类都可以提供函数
std::ostream& serialize(std::ostream& os) const;
,并准备好像std::ostream
的所有基本类型一样使用
std::ostream& operator<<(std::ostream&, ...)
必须是一个自由函数
将它移出类,它将工作。
这样做的原因是在类中定义operator<<(std::ostream&)
(或其他二进制操作符)意味着对象是LHS操作数。你必须写一些疯狂的东西,比如:
Node << std::cout;
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多