C++ 重载 ostream 和 istream 运算符
C++ overloading the ostream and istream operators
此代码的目的是读取包含名称、十亿美元和国家/地区的文件,这些文件由制表符分隔。
我需要创建一个 class 亿万富翁并重载 ostream 和 istream 运算符以方便
将文件读入向量并将内容写入输出。然后创建一个映射,将国家字符串映射到一对。该对包含第一个的副本
名单中每个国家的亿万富翁和计算每个国家亿万富翁人数的计数器
国家。但是,我不能重载流和流运算符。
我试图在亿万富翁 class 中重载这些运算符,但我以错误告终。
#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
中定义了这些运算符,编译器将无法在此处使用它们:主要是您调用独立运算符(您已声明为友元),而您会已经定义了 class 成员,这些成员必须使用 .
或 ->
运算符在 Billionaire
上调用,并且具有与您在 main 中使用的签名不同的签名。
此代码的目的是读取包含名称、十亿美元和国家/地区的文件,这些文件由制表符分隔。 我需要创建一个 class 亿万富翁并重载 ostream 和 istream 运算符以方便 将文件读入向量并将内容写入输出。然后创建一个映射,将国家字符串映射到一对。该对包含第一个的副本 名单中每个国家的亿万富翁和计算每个国家亿万富翁人数的计数器 国家。但是,我不能重载流和流运算符。
我试图在亿万富翁 class 中重载这些运算符,但我以错误告终。
#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
中定义了这些运算符,编译器将无法在此处使用它们:主要是您调用独立运算符(您已声明为友元),而您会已经定义了 class 成员,这些成员必须使用 .
或 ->
运算符在 Billionaire
上调用,并且具有与您在 main 中使用的签名不同的签名。