QT:重载 Qdatastream 中的“<<”运算符时出错

Posted

技术标签:

【中文标题】QT:重载 Qdatastream 中的“<<”运算符时出错【英文标题】:QT: Error Overloading the "<<" operator in Qdatastream 【发布时间】:2012-02-13 07:52:20 【问题描述】:

我有课

class budget

    float transportation, grocery, food, stationery;
    QString key;
public:
//input output functions here.

;

我为我的班级创建了一个 QHash> 和

QDataStream &operator <<(QDataStream &stream, budget &myclass)

    stream<<myclass.getFood();
    stream<<myclass.getGrocery();
    stream<<myclass.getKey();
    stream<<myclass.getStatn();
    stream<<myclass.getTransport();

    return stream;


QDataStream &operator >>(QDataStream &stream, budget &myclass)

    float f;
    QString s;
    stream>>f;
    myclass.addFood(f);
    stream>>f;
    myclass.addGrocery(f);
    stream>>s;
    myclass.addDate(s);
    stream>>f;
    myclass.addStatn(f);
    stream>>f;
    myclass.addTransport(f);

    return stream;

但即使现在我仍然得到一个错误:

C:\Users\Karthik\QT\Mendrive-build-simulator-Simulator_Qt_for_MinGW_4_4__Qt_SDK__Debug........\QtSDK\Simulator\Qt\mingw\include\QtCore\qdatastream.h:381: 错误:'operator

为什么会这样?显然 >> 运算符似乎超载了我只得到

谢谢。

【问题讨论】:

【参考方案1】:

错误源于函数签名的声明。更改您的声明:

QDataStream &operator <<(QDataStream &stream, budget &myclass);
QDataStream &operator >>(QDataStream &stream, budget &myclass);

到:

QDataStream &operator <<(QDataStream &stream, const budget &myclass);
QDataStream &operator >>(QDataStream &stream, budget &myclass);

here描述了同样的问题

对不起,我错过了一件事。方法也必须声明为朋友。所以我已经尝试过了,这是工作结果;

class budget

  float transportation, grocery, food, stationery;
  QString key;
public:
  budget() 

friend QDataStream &operator <<(QDataStream &stream, const budget &myclass) 

      stream<< myclass.food;
      stream<< myclass.grocery;
      stream<< myclass.key;
      stream<< myclass.stationery;
      stream<< myclass.transportation;

    return stream;


friend QDataStream &operator >>(QDataStream &stream, budget &myclass) 

    stream >> myclass.food;
    stream >> myclass.grocery;
    stream >> myclass.key;
    stream >> myclass.stationery;
    stream >> myclass.transportation;
    return stream;


更新

要回答您有关朋友功能的问题,请让我指出您已经提供的答案here

【讨论】:

我一开始就尝试了上面的解决方案,但是导致了 5 个表单错误:C:\Users\Karthik\QT\Mendrive-build-simulator-Simulator_Qt_for_MinGW_4_4__Qt_SDK__Debug\..\Mendrive\fileoverload.h:11: error: passing 'const budget' as 'this' argument of 'float budget::**getFood()**' discards qualifiers 其中 getFood() 被其他成员函数替换。这就是为什么我尝试删除 const 是的,因为函数必须返回 const 值。 是的!将其声明为友元函数做到了!你能否解释一下,它是如何产生影响的?我仍然不明白为什么它不能作为非朋友功能工作。非常感谢! 你真的应该学习如何使用'const',在某个地方查找教程并阅读它。也许这 parashift.com/c++-faq-lite/const-correctness.html 。改变你的“浮动预算::getFood();” “浮动预算::getFood() const;”的方法

以上是关于QT:重载 Qdatastream 中的“<<”运算符时出错的主要内容,如果未能解决你的问题,请参考以下文章

来自 QDataStream 的 QT QString

请教QDatastream与QVariant的相关问题(QT编程)

qt中QVector<QTextBlock>如何转入QDataStream?

Qt笔记——QFile,QDataStream,QTextStream

QList<Class*> 的 QDatastream 运算符>>

Qt QSharedMemory 和 QDataStream