【问题标题】:error: no match for 'operator>>' (operand types are 'QDataStream' and 'Unit*')错误:“operator>>”不匹配(操作数类型为“QDataStream”和“Unit*”)
【发布时间】:2016-04-28 06:56:06
【问题描述】:

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

【问题讨论】:

  • 你如何使用这些功能?您能尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们看吗?请在问题正文中包含完整且未经编辑的错误输出。
  • 我没有使用这些函数,它们是为在 qsettings 中保存和加载自定义类而定义的
  • @JoachimPileborg 我编辑了问题
  • 不错的新帐户@andreahmed
  • @AlexisP。你在这里找到问题了吗?

标签: c++ qt


【解决方案1】:
QDataStream &operator<<(QDataStream &out, Unit *&unit);

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

但无论如何,对流操作符使用可复制和自构造类型是一个好习惯。因为未初始化的指针有很多潜在的错误。

【讨论】:

  • 请看一下我在帖子中更新的代码,我仍然收到一个错误,即 /usr/include/qt/QtCore/qmetatype.h:771: error: no match for 'operator> >'(操作数类型是'QDataStream'和'Unit')流>> *static_cast(t); ^
  • @ahmedandre 我忘了删除 const ;)
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2023-04-07
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多