地狱!我正在尝试创建一个可以帮助我输出文本到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
编辑:对于你想知道的一切,我没有使用命名空间......
答案 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绑定了,那么使用它应该不是问题。