c++ - 如何在结构中重载运算符<<
问题描述
我只想打印我的结构的两个值,但无法编译我的代码 - 我得到:没有运算符“<<”与这些操作数匹配。
#include <iostream>
using namespace std;
struct SCoor
{
int i, j;
bool operator == (const SCoor & tmp) const
{
return (i == tmp.i && j == tmp.j);
}
bool operator < (const SCoor & tmp) const
{
return (i < tmp.i || (i == tmp.i && j < tmp.j));
}
ostream& operator << (ostream &o) {
return o << i << " " << j;
}
};
int main()
{
SCoor tmp = { 3, 3 };
cout << tmp;
return 0;
}
我如何必须重载运算符“<<”?
解决方案
如果您希望结构位于表达式的左侧<<
,则将运算符作为成员函数重载。所以:
struct SCoor
{
// ...
SCoor& operator << (Stuff const& s) {
// ...
return *this;
}
};
// ...
Stuff stuff;
SCoor scoor;
scoor << s; // insert s into my SCoor
如果你想让你的结构在表达式的右边,<<
你必须定义一个独立的函数:
std::ostream& operator<<(std::ostream& os, SCoor const& scoor)
{
return os << scoor.i << " " << scoor.j;
}
然而,将外部函数设为友元函数并在定义中定义它是很常见的struct
:
struct SCoor
{
// ...
friend std::ostream& operator<<(std::ostream& os, SCoor const& scoor)
{
return os << scoor.i << " " << scoor.j;
}
};
// ...
SCoor scoor;
std::cout << scoor << '\n';
但它不是您的结构的成员,它只是为了方便而在其定义中定义。
推荐阅读
- c# - 如何在 Visual Studio 扩展中实现默认的大纲工具提示?
- android - 广播 android.intent.action.MEDIA_SCANNER_SCAN_FILE 在 Android 11 中不起作用
- angular - RxJs 主题在订阅时获得多个值
- python - 张量流。Batch Tensor 修改一个条目(张量)
- nginx - 【nginx】如何比较nginx中的ip和文件中的ip
- python - 如何实现异步生成器?
- html - 滚动条的自定义 CSS
- javascript - 捆绑依赖的 javascript 文件而不需要使用 webpack
- php - SQL - 按状态排序
- java - 如果客户支付的费用低于票价