我正在尝试为名为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.
更多推荐
发布评论