2016-04-28 14 views
0

ユニットと呼ばれるカスタムクラスの演算子>>と< <を定義しようとしています。ポインタを格納します。ここエラー: '演算子' 'と一致しません(オペランドの種類は' 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); 
       ^

を関数を定義する方法でありますメタタイプ

私は

定義Unit.hのヘッダに

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

を定義MAINで

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

:0

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

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:エラー: '演算子' 'に一致しません(オペランドの種類は' QDataStream 'と' Unit ') ストリーム>> * static_cast (t); ^ –

+0

@ahmedandre constを削除するのを忘れました;) –

関連する問題