C ++ перегрузка операторов ostream и istream - PullRequest
1 голос
/ 13 октября 2019

Целью этого кода является чтение файла, содержащего название, доллары в миллиардах и страну, которые разделены вкладками. Мне нужно создать класс Billionaire и перегрузить операторы 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, чтобы увидеть вызов)

1 Ответ

0 голосов
/ 13 октября 2019

Ваша попытка перегрузки - хорошее начало: вы объявили компилятору о перегрузке:

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 вы вызываете автономный оператор (который вы объявили другом), тогда как вы бы определили членов класса, которые должны вызываться на Billionaire с оператором . или -> и иметь другую подписьчем то, что вы используете в основном.

...