错误:'operator >>'不匹配(操作数类型为'QDataStream'和'Unit *')(error: no matc

编程入门 行业动态 更新时间:2024-10-25 18:33:51
错误:'operator >>'不匹配(操作数类型为'QDataStream'和'Unit *')(error: no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*'))

我正在尝试为名为Unit的自定义类定义运算符>>和<<,我需要存储指针。

这是我如何定义函数

QDataStream &operator<<(QDataStream &out, const Unit *unit) { out << unit->value(); return out; } QDataStream &operator>>(QDataStream &in, Unit *unit) { double value; in >> value; unit->setUserValue(value); return in; } void Unit::setUserValue(const qreal userValue) { qDebug() << "setUserValue" << this->userValue() << userValue << QString::number(m_unit,2); if (this->userValue() == userValue) return; if(isDefault()) m_value = userValue; else m_value = UnitManager::convertFrom(userValue,m_unit); qDebug() << "Value" << m_value; emit userValueChanged(); setDirty(RamDirty); } qRegisterMetaType<Unit*>(); qRegisterMetaTypeStreamOperators<Unit *>();

我收到以下编译错误消息

error: no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*')

这里也是一个错误

/usr/include/qt/QtCore/qmetatype.h:771: error: invalid initialization of non-const reference of type 'quint8& {aka unsigned char&}' from an rvalue of type 'quint8 {aka unsigned char}' stream >> *static_cast<T*>(t); ^

我还定义了元类型

Q_DECLARE_METATYPE(Unit) Q_DECLARE_METATYPE(Unit*)

单元类接口

class Unit : public EraObject { Q_OBJECT Q_PROPERTY(qreal userValue READ userValue WRITE setUserValue NOTIFY userValueChanged) Q_PROPERTY(quint32 category READ category CONSTANT) Q_PROPERTY(quint32 unit READ unit WRITE setup) Q_PROPERTY(QString symbol READ symbol NOTIFY symbolChanged) Q_ENUMS(CategoryId) Q_ENUMS(UnitId) public: Unit(const Unit &other); Unit(int unit = Default, QObject *parent = 0); ~Unit() {} enum CategoryId { NoneCategory, TemperatureCategory, PressureCategory, CountCategory }; enum UnitId { Default = NoneCategory, //Temperature Celsius = TemperatureCategory << 16, Fahrenheit, CountTemperature, //Pressure Pascal = PressureCategory << 16, Bar, CountPressure }; qreal value() const { return m_value; } qreal userValue() const; quint32 category() const { return m_unit >> 16 ; } quint32 unit() const { return m_unit; } QString symbol() const; inline bool isDefault() const { return !(m_unit & 0xffff); } //Operators operator qreal() const; Unit& operator=(const qreal value); bool operator==(const Unit &other) const { return (m_value == other.m_value); } bool operator<(const Unit &other) const { return (m_value < other.m_value); } void loadFrom(Settings &set, bool ownGroup = true) override; void saveTo(Settings &set, bool ownGroup = true, bool force = false) override; private: qreal m_value; quint32 m_unit; signals: void userValueChanged(); void unitChanged(int unit); void symbolChanged(); public slots: void changeUnit(const quint32 &unit); void setUserValue(const qreal userValue); void setup(quint32 unit, const QString name = QString(),QObject *parent = 0); }; Q_DECLARE_METATYPE(Unit*)

更新:

QDataStream &operator<<(QDataStream &out, const Unit *&unit) { out << unit->value(); return out; } QDataStream &operator>>(QDataStream &in, Unit *&unit) { qreal value; in >> value; unit->setUserValue(value); return in; }

在主要我定义

qRegisterMetaType<Unit*>(); qRegisterMetaTypeStreamOperators<Unit *>();

在我定义的Unit.h的标题中

Q_DECLARE_METATYPE(Unit*) Q_DECLARE_METATYPE(Unit)

I'm trying to define the operators >> and << for a custom class called Unit, and I need to store a pointer.

here is how I define the functions

QDataStream &operator<<(QDataStream &out, const Unit *unit) { out << unit->value(); return out; } QDataStream &operator>>(QDataStream &in, Unit *unit) { double value; in >> value; unit->setUserValue(value); return in; } void Unit::setUserValue(const qreal userValue) { qDebug() << "setUserValue" << this->userValue() << userValue << QString::number(m_unit,2); if (this->userValue() == userValue) return; if(isDefault()) m_value = userValue; else m_value = UnitManager::convertFrom(userValue,m_unit); qDebug() << "Value" << m_value; emit userValueChanged(); setDirty(RamDirty); } qRegisterMetaType<Unit*>(); qRegisterMetaTypeStreamOperators<Unit *>();

I'm getting the following compilation error message

error: no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*')

and also an error here

/usr/include/qt/QtCore/qmetatype.h:771: error: invalid initialization of non-const reference of type 'quint8& {aka unsigned char&}' from an rvalue of type 'quint8 {aka unsigned char}' stream >> *static_cast<T*>(t); ^

I also defined the meta type

Q_DECLARE_METATYPE(Unit) Q_DECLARE_METATYPE(Unit*)

The unit class interface

class Unit : public EraObject { Q_OBJECT Q_PROPERTY(qreal userValue READ userValue WRITE setUserValue NOTIFY userValueChanged) Q_PROPERTY(quint32 category READ category CONSTANT) Q_PROPERTY(quint32 unit READ unit WRITE setup) Q_PROPERTY(QString symbol READ symbol NOTIFY symbolChanged) Q_ENUMS(CategoryId) Q_ENUMS(UnitId) public: Unit(const Unit &other); Unit(int unit = Default, QObject *parent = 0); ~Unit() {} enum CategoryId { NoneCategory, TemperatureCategory, PressureCategory, CountCategory }; enum UnitId { Default = NoneCategory, //Temperature Celsius = TemperatureCategory << 16, Fahrenheit, CountTemperature, //Pressure Pascal = PressureCategory << 16, Bar, CountPressure }; qreal value() const { return m_value; } qreal userValue() const; quint32 category() const { return m_unit >> 16 ; } quint32 unit() const { return m_unit; } QString symbol() const; inline bool isDefault() const { return !(m_unit & 0xffff); } //Operators operator qreal() const; Unit& operator=(const qreal value); bool operator==(const Unit &other) const { return (m_value == other.m_value); } bool operator<(const Unit &other) const { return (m_value < other.m_value); } void loadFrom(Settings &set, bool ownGroup = true) override; void saveTo(Settings &set, bool ownGroup = true, bool force = false) override; private: qreal m_value; quint32 m_unit; signals: void userValueChanged(); void unitChanged(int unit); void symbolChanged(); public slots: void changeUnit(const quint32 &unit); void setUserValue(const qreal userValue); void setup(quint32 unit, const QString name = QString(),QObject *parent = 0); }; Q_DECLARE_METATYPE(Unit*)

UPDATE:

QDataStream &operator<<(QDataStream &out, const Unit *&unit) { out << unit->value(); return out; } QDataStream &operator>>(QDataStream &in, Unit *&unit) { qreal value; in >> value; unit->setUserValue(value); return in; }

In MAIN I define

qRegisterMetaType<Unit*>(); qRegisterMetaTypeStreamOperators<Unit *>();

in the header of Unit.h I define

Q_DECLARE_METATYPE(Unit*) Q_DECLARE_METATYPE(Unit)

最满意答案

QDataStream &operator<<(QDataStream &out, Unit *&unit);

您正在尝试传递指针而不是对指针的引用。

但无论如何,对流操作符使用可复制和可自构造的类型是一种好习惯。 因为未初始化指针存在很多潜在错误。

QDataStream &operator<<(QDataStream &out, Unit *&unit);

You are trying to pass a pointer instead of a reference to pointer.

But anyway, it is a good practice to use copyable and self-constructable types for stream operators. Because you have a lot of potential errors with uninitialized pointers.

更多推荐

本文发布于:2023-08-02 18:41:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1379980.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不匹配   错误   类型   操作   operator

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!