c++ - C++ 重载 ostream 和 istream 运算符
问题描述
这段代码的目的是读取包含名称、十亿美元和国家的文件,这些文件由制表符分隔。我需要创建一个类 Billionaire 并重载 ostream 和 istream 运算符,以便方便地将文件读入向量并将内容写入输出。然后创建一个地图,将国家字符串映射到一对。这对包含列表中每个国家的第一位亿万富翁的副本和一个用于计算每个国家亿万富翁人数的计数器。但是,我不能重载流和流运算符。
我试图在亿万富翁类中重载这些运算符,但我最终遇到了错误。
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <set>
#include <map>
#include <string>
#include <iterator>
#include <fstream>
#include <istream>
#include <ostream>
using namespace std;
class Billionaire{
//overload the ostream and istream operators to conveniently
//read the file into a vector and write the content to the output
public :
friend ostream &operator<<(ostream &stream, Billionaire o);
friend istream &operator>>(istream &stream, Billionaire &o);
};
int main(){
std::ifstream stream("Forbes2018.txt");
if(!stream){
cout << " WARNING : File not found !" << endl ;
}
vector <Billionaire> billionaires;
copy (istream_iterator<Billionaire>( stream ),
istream_iterator<Billionaire>() , back_inserter( billionaires ));
copy (billionaires.begin () , billionaires.end () ,
ostream_iterator < Billionaire >( cout , "\n"));
map < string , pair < const Billionaire , size_t >> m;
}
我有 2 个错误::-1:错误:未找到架构 x86_64 的符号:-1:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
解决方案
您的重载尝试是一个好的开始:您已向编译器宣布将发生重载:
friend ostream &operator<<(ostream &stream, Billionaire o);
friend istream &operator>>(istream &stream, Billionaire &o);
不幸的是,缺少一些东西。这就是链接器消息所说的。你仍然需要告诉编译器这个重载是什么样子的:
ostream &operator<<(ostream &stream, Billionaire o) {
// put your code here
...
return stream;
}
istream &operator>>(istream &stream, Billionaire &o) {
// put your code here
...
return stream;
}
如果您在 中定义了这些运算符Billionaire
,编译器将无法在此处使用它们:在 main 中,您调用独立运算符(您已声明为友元),而您将定义必须调用的类成员aBillionaire
与.
or->
运算符并具有与您在 main 中使用的不同的签名。
推荐阅读
- c++ - 函数参数过多的问题
- javascript - 带有滑块的 Ag-grid 单元格渲染器不起作用
- r - 如何计算数据框的一行和剩余行之间的相关性
- vue.js - npm run build 后组件出现问题
- sql - SQL Server 2014 Express 性能调整
- javascript - 提交前应至少选择两个输入
- python - 为什么我的三引号输出有两个换行符?
- python-3.x - 使用 pyinstaller 的 python 可执行文件生成器
- lua - 如何正确有效地打乱表格的内容?
- scala - IntelliJ 上的 java.lang.StackOverflowError