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

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

本文关键字:gt QDataStream Unit operator 不匹配 错误 操作数 类型      更新时间:2023-10-16

我正在尝试为一个名为 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)
QDataStream &operator<<(QDataStream &out, Unit *&unit);

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

但无论如何,对流运算符使用可复制和可自我构造的类型是一种很好的做法。因为未初始化的指针有很多潜在的错误。