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

时间:2016-04-28 06:56:07

标签: c++ qt

我正在尝试定义运算符>>和<<对于一个名为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;
}

在MAIN我定义

qRegisterMetaType<Unit*>();
qRegisterMetaTypeStreamOperators<Unit *>();
在Unit.h的标题中

我定义

Q_DECLARE_METATYPE(Unit*)
Q_DECLARE_METATYPE(Unit)

1 个答案:

答案 0 :(得分:1)

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

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

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