C ++重载<<除非我包含endl,否则operator不能正确输出

时间:2016-10-26 02:23:40

标签: c++ operator-overloading string-formatting endl

我有一个非常有趣的问题。

基本上我重载了插入操作符以返回我的类的字符串表示。但是,程序只是终止,除非我包含std :: endl。

template<class T>
std::ostream& operator << (std::ostream& outs, const LinkedQueue<T>& q) {

    outs << "queue[";

    if (!q.empty()) {
        outs << q.front->value;

        for (auto i = ++q.begin(); i != q.end(); ++i)
            outs << ',' << *i;
    }
    outs << "]:rear";

    return outs;
}

int main() {
    QueueType queueType1;
    queueType1.enqueue("L");
    std::cout << queueType1 << std::endl;
   return 0;
}

上面的main产生正确的输出:queue [L]:rear

但是,如果我从main中删除std::endl,程序就会中断而不会产生任何内容。

我不能在重载方法中包含endl,因为它会为我的字符串添加一个额外的字符,而不是我的字符串。有什么建议?

1 个答案:

答案 0 :(得分:1)

正如@samevarshavchik建议的那样,使用std::flush代替std::endl来完成所需的输出。这可以在main中完成:

int main() {
    QueueType queueType1;
    queueType1.enqueue("L");
    std::cout << queueType1 << std::flush;
                              /*^^^here^^^*/
    return 0;
}

或者在你的重载函数中:

template<class T>
std::ostream& operator << (std::ostream& outs, const LinkedQueue<T>& q) {

    outs << "queue[";

    if (!q.empty()) {
        outs << q.front->value;

        for (auto i = ++q.begin(); i != q.end(); ++i)
            outs << ',' << *i;
    }
    outs << "]:rear" << std::flush;
                      /*^^^here^^^*/
    return outs;
}