Класс, который наследует std :: ostream и operator << для QString - PullRequest
2 голосов
/ 07 февраля 2011

Ад! Я пытаюсь создать класс, который помог бы мне с выводом текста на стандартный вывод ... Во всяком случае, все работает, кроме одной вещи. Допустим, я создал объект своего класса. Когда я это делаю, все отлично работает:

out<<"test test"<<std::endl;

И это также работает, когда я делаю это:

out<<QString("another string")<<std::endl;

Но когда я пытаюсь соединить эти две вещи вместе, вот так:

out<<"test test"<<std::endl<<QString("another string")<<std::endl;

Я получаю эту супер-большую ошибку, которая в итоге говорит мне, что оператор << не принимает параметр типа QString. Это странно, потому что это работает нормально, когда я не соединяю QString ... Также это работает: </p>

out<<"test test"<<std::endl<<"another string"<<std::endl;

и это:

out<<QString("another string")<<std::endl<<"test test"<<std::endl;

Так что я думаю, у меня проблема с моей функцией operator <<, или я не сделал operator << правильно, или я не вернул правильное значение. Или, может быть, что-то еще не так. Во всяком случае, я не могу понять это, так что вы могли бы мне помочь? Ниже приведен исходный код: </p>

output.h: http://xx77abs.pastebin.com/b9tVV0AV output.cpp: http://xx77abs.pastebin.com/5QwtZRXc

И конечно, супер-большая ошибка: D

http://xx77abs.pastebin.com/8mAGWn47

РЕДАКТИРОВАТЬ: для всех вас интересно, я не использую пространства имен ...

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

Это компилируется для меня (с командной строкой из вашей третьей ссылки):

#include <iostream>
#include <sstream>
#include <QString>

class Output: public std::ostream
{
    friend std::ostream& operator<<(std::ostream &out, const QString var);
private:

    class StreamBuffer: public std::stringbuf
    {
    private:
        std::ostream &out;
        QString prefix;

    public:
        StreamBuffer(std::ostream& str, const QString &p);
         virtual int sync();
    };

    StreamBuffer buffer;

public:
    Output(const QString &prefix);
};
 Output::Output(const QString &prefix) :
    std::ostream(&buffer), buffer(std::cout, prefix)
{

}

Output::StreamBuffer::StreamBuffer(std::ostream& str, const QString &p)
    :out(str)
{
    prefix = p + "-> ";
}

std::ostream& operator<<(std::ostream &out, const QString var)
{
    out<<qPrintable(var);

    return out;
}

int Output::StreamBuffer::sync()
{
    out <<qPrintable(prefix)<< str();
    str("");
    out.flush();
    return 0;
}

int main()
  {
  Output out (QString (">")) ;
  out<<"test test"<<std::endl;
  out<<QString("another string")<<std::endl;
  out<<"test test"<<std::endl<<QString("another string")<<std::endl;
  }

Если он также скомпилирован для вас, вы сможете преобразовать его в код ошибки, чтобы найти ошибку.

1 голос
/ 07 февраля 2011

Я чувствую себя обязанным отметить, что Qt предоставляет функцию / класс, чтобы сделать именно это, и она называется QDebug.Поскольку вы уже связаны с Qt, использовать его не должно быть проблемой.

1 голос
/ 07 февраля 2011

Используете ли вы пространства имен?Если да, вы определили operator<< для QString в определенном пространстве имен?Я не вижу ничего плохого в приведенном выше коде (за исключением того, что перегрузка должна принимать константную ссылку, а не копию!)не будет найден.

EDIT2: добавьте объявление operator<< в файл заголовка после объявления вашего класса - компилятор не знает о существовании этой перегрузки, пока вы не сделаете.1009 *

...