继承std :: ostream和operator<<的类对于QString

时间:2011-02-07 14:44:44

标签: c++ qt operator-overloading outputstream qstring

地狱!我正在尝试创建一个可以帮助我输出文本到stdout的课程......无论如何,除了一件事,一切都正常。让我们说我已经创建了我班级的对象。当我这样做时,一切都完美无缺:

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

当我这样做时它也有效:

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

但是,当我尝试将这两件事连在一起时,就像这样:

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

我得到那个超级大错误,最终告诉我运营商&lt;&lt;不接受QString类型的参数。这很奇怪,因为当我不链接QString时它工作正常......这也有效:

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

和此:

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

所以我想我的操作员有问题&lt;&lt; function ...要么我没有制作运算符&lt;&lt;正确的,或者我没有返回正确的值。或者其他可能是错误的。无论如何,我无法弄明白,你能帮助我吗?贝娄是源代码:

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

当然,超级大错误:D

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

编辑:对于你想知道的一切,我没有使用命名空间......

3 个答案:

答案 0 :(得分:1)

您使用的是命名空间吗?如果您是,是否在特定名称空间中为operator<<定义了QString?我看不出上面的代码有什么问题(重载除了应该接受const引用而不是副本!)

编辑:如果它在命名空间中,请添加,将其移出,否则将无法找到。

EDIT2:在您的类声明之后将operator<<的声明添加到头文件中 - 编译器在您执行此操作之前不知道是否存在此重载。

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

答案 1 :(得分:1)

这为我编译(使用第三个链接的命令行):

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

如果它也为你编译,你应该能够将它变形为失败的代码以找到错误。

答案 2 :(得分:1)

我觉得有必要注意Qt提供了一个函数/类来完成这个,它被称为QDebug。既然你已经被Qt绑定了,那么使用它应该不是问题。