[C ++重载ostream和istream运算符

问题描述 投票:0回答:1

此代码的目的是读取包含名称,十亿美元和用制表符分隔的国家/地区的文件。我需要创建一个“亿万富翁”类,并将ostream和istream运算符重载以方便将文件读入向量并将内容写入输出。然后创建一个地图,将国家/地区字符串映射为一对。该对包含第一个的副本列表中每个国家的亿万富翁和一个计数器,用于计算每个国家的亿万富翁人数国家。但是,我不能重载流和流运算符。

我曾尝试使这些操作符在Billionaire类中超载,但最终会出现错误。

#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查看调用)

c++ vector stream ostream istream
1个回答
0
投票

您的重载尝试是一个好的开始:您已经向编译器宣布将有重载:

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中定义了这些运算符,则编译器将无法在此处使用它们:主要是,您将调用独立的运算符(您已声明为Friend),而您将定义的类成员必须使用Billionaire.运算符在->上调用,并且其签名与main中使用的签名不同。

© www.soinside.com 2019 - 2024. All rights reserved.