我試圖爲一個名爲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)
你如何使用這些功能?你能否請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示?並且請在問題的正文中包含完整的和未經編輯的錯誤輸出。 –
我沒有使用這些函數,它們被定義用於保存和加載自定義類的qsettings –
@JoachimPileborg我編輯了問題 –