我正在尝试定义运算符>>和<<对于一个名为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)
答案 0 :(得分:1)
QDataStream &operator<<(QDataStream &out, Unit *&unit);
您正在尝试传递指针而不是对指针的引用。
但无论如何,对流操作符使用可复制和可自构造的类型是一种好习惯。因为未初始化指针存在很多潜在错误。