c++ - 错误 : no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*' )

标签 c++ qt

我正在尝试为名为 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*)

单元类接口(interface)

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的header中我定义

Q_DECLARE_METATYPE(Unit*)
Q_DECLARE_METATYPE(Unit)

最佳答案

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

您正在尝试传递指针而不是对指针的引用。

但无论如何,为流运算符使用可复制和可自构造的类型是一种很好的做法。因为你有很多未初始化指针的潜在错误。

关于c++ - 错误 : no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36907387/

相关文章:

c++ - 如何在 C++ 中将枚举的十六进制值打印到字符串

python 永远不能调用包含继承逻辑的 c++ dll 或 so 文件?

c++ - 内存泄漏跟踪

c++ - 使用 sbrk 自定义内存管理

java - 在 Android 上移植 Qt 代码及其工作原理

c++ - 通过套接字QT发送文件

c++ - 重载函数未使用:

c++ - 无法进入 QSortFilterProxyModel 的功能

c++ - Qt 在其他范围内访问 TextEdit 的文本

c++ - QObject* 和 void* 之间的转换