ユニットと呼ばれるカスタムクラスの演算子>>と< <を定義しようとしています。ポインタを格納します。ここエラー: '演算子' 'と一致しません(オペランドの種類は' 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)
これらの機能をどのように使用しますか?あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。また、問題の本文に完全で未編集のエラー出力を含めてください。 –
私はこれらの関数を使用していません。qsettingsでカスタムクラスを保存して読み込むために定義されています。 –
@JoachimPileborg質問を編集しました –