std :: cout не работает с перегруженным оператором << для структуры - PullRequest
2 голосов
/ 25 сентября 2019

Я реализовал перегрузку оператора << для struct LevelStats, которая, кажется, хорошо работает с файлами, но столкнулась с проблемой при использовании с заголовочным файлом std :: cout </p>

:

struct LevelStats
{
    DIFFICULTY level;
    std::chrono::duration<double> best_time;
    unsigned int games_played;
    unsigned int games_won;

};

std::ofstream& operator<<(std::ofstream &os, const LevelStats &stats);

cpp file:

std::ofstream &operator<<(std::ofstream &os, const LevelStats &stats) {
    os << static_cast<unsigned int>(stats.level) << " " << "Best_Time= " << stats.best_time.count()<<std::endl;
    os << static_cast<unsigned int>(stats.level) << " " << "Games_Played= " << stats.games_played<<std::endl;
    os << static_cast<unsigned int>(stats.level) << " " << "Games_Won= " << stats.games_won<<std::endl;

    return os;
}

Это хорошо работает для таких операций, как

file << LevelStats object </p>

, но при использовании в качестве

std :: cout << Объект LevelStats </p>

приводит к:

ошибка: невозможно связать 'std :: ostream {aka std:: basic_ostream} 'lvalue to' std :: basic_ostream && '

Редактировать: заменен на std :: ostream и встречает ту же ошибку Другое редактирование: тупая ошибка в аргументах - работает

1 Ответ

3 голосов
/ 25 сентября 2019

Ваш operator<< объявлен как

std::ofstream& operator<<(std::ofstream &os, const LevelStats &stats);

Обратите внимание, что вы передаете и возвращаете ссылку на std::ofstream.Запись в файл будет работать, потому что вы передадите std::ofstream&, но std::cout не является std::ofstream& и не может связываться с std::ofstream&.

Если вы хотите иметь возможность вывести свой struct используя std::cout, пока еще можно использовать std::ofstream, измените operator<< на

std::ostream& operator<<(std::ostream &os, const LevelStats &stats);

Обе std::ofstream и std::ostream могут связываться с std::ostream &os, что позволяет вам написать свойstruct для обоих файлов и std::cout.

...