2016-04-28 72 views
0

我試圖爲一個名爲Unit的自定義類定義運算符>>和< <,並且我需要存儲一個指針。錯誤:'operator >>'不匹配(操作數類型爲'QDataStream'和'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); 
       ^

我還定義了meta type

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*) 

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; 
} 

在MAIN我在Unit.h的報頭定義

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

我定義

Q_DECLARE_METATYPE(Unit*) 
Q_DECLARE_METATYPE(Unit) 
+0

你如何使用這些功能?你能否請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示?並且請在問題的正文中包含完整的和未經編輯的錯誤輸出。 –

+0

我沒有使用這些函數,它們被定義用於保存和加載自定義類的qsettings –

+0

@JoachimPileborg我編輯了問題 –

回答

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

您正試圖傳遞一個指針而不是對指針的引用。

但是,無論如何,對流操作符使用可複製和可自我構造的類型是一種很好的做法。因爲未初始化的指針有很多潛在的錯誤。

+0

請在我的帖子中看看我更新後的代碼,但我得到的錯誤是/ usr/include/qt/QtCore/qmetatype。h:771:錯誤:'operator >>'不匹配(操作數類型爲'QDataStream'和'Unit') stream >> * static_cast (t); ^ –

+0

@ahmedandre我忘了刪除const;) –

相關問題