C++使 ostream 和 istream 运算符过载

C++ overloading the ostream and istream operators

本文关键字:运算符 istream ostream C++      更新时间:2023-10-16

此代码的目的是读取包含名称,十亿美元和国家/地区的文件,这些文件由制表符分隔。 我需要创建一个类亿万富翁,并使 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中,你调用独立运算符(你已经声明为friend(,而你会定义类成员,这些类成员必须在Billionaire上用.->运算符调用,并且具有与你在main中使用的不同的签名。