std :: cout不适用于结构的重载'<<'运算符

时间:2019-09-25 09:51:22

标签: c++ struct operator-overloading std

我已经为结构LevelStats实现了运算符'<<'重载,该重载似乎可以很好地处理文件,但是在与std :: cout一起使用时遇到问题

头文件:

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文件:

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;
}

对于

之类的操作来说效果很好
  

文件<< LevelStats对象

,但用作

  

std :: cout << LevelStats对象

结果:

  

错误:无法绑定“ std :: ostream {aka std :: basic_ostream}”   左值'std :: basic_ostream &&'

编辑:替换为std :: ostream&遇到相同的错误 另一个编辑:参数中的哑巴错误-有效

1 个答案:

答案 0 :(得分:3)

您的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::ofstreamstd::ostream都可以绑定到std::ostream &os,从而使您可以将struct写入文件和std::cout