Проблема с перегрузкой оператора “>>” в qt4

214
17 сентября 2017, 01:11

Есть класс EventData:

class EventData
{
  public:
    enum DataType
    {
        FaultType = 1,
        Line = 2,
        Current = 3,
        Voltage = 4,
        Distance = 5,
        Resistance = 6
    };
    EventData();
    EventData(quint32 id, quint64 timestamp, quint8 type);
    EventData(const EventData& ev);
    EventData& operator =(const EventData& ev);
    quint32 id() const
    {
        return m_id;
    }
    quint64 timestamp()
    {
        return m_timestamp;
    }
    quint8 type() const
    {
        return m_type;
    }
    int valueCount() const
    {
        return m_values.count();
    }
    quint32 byteSize() const
    {
        return  17 + 5 * m_values.size();
    }
    void setValue(DataType key, const Variant& value);
    bool value(DataType key, Variant& value) const;
    EventData* copy()
    {
        return new EventData(*this);
    }
    friend QDataStream& operator <<(QDataStream& out,
                                    const EventData& ev);
    friend QDataStream& operator >>(QDataStream& in, EventData& ev);
  private:
    void initFrom(const EventData& ev);
    quint32 m_id;
    quint64 m_timestamp;
    quint8 m_type;
    typedef QHash<quint8, Variant> Values;
    Values m_values;
};
QDataStream& operator <<(QDataStream& out, const EventData& ev)
{
    out << ev.m_id;
    out << ev.m_timestamp;
    out << ev.m_type;
    out << ev.m_values;
    return out;
}
QDataStream& operator >>(QDataStream& in, EventData& ev)
{
    in >> ev.m_id;
    in >> ev.m_timestamp;
    in >> ev.m_type;
    in >> ev.m_values;
    return in;
}

При сборке получаю

/usr/include/qt4/QtCore/qdatastream.h:383: error: no match for ‘operator<<’ (operand types are ‘QDataStream’ and ‘const Variant’) out << it.key() << it.value();

Сам вызов оператора:

EventData ev;
QDataStream in;
in.setVersion(QDataStream::Qt_4_8);
in.setByteOrder(QDataStream::LittleEndian);
QFile alarmFile(m_fileName);
if(alarmFile.open(QIODevice::ReadOnly)) {
    in.setDevice(&alarmFile);
    while(!in.atEnd() && in.status() == QDataStream::Ok) {
        in >> ev;
    }
    alarmFile.close();
}
Answer 1

Для типа Variant не перегружен оператор <<. Используйте QVariant или реализуйте самостоятельно.

READ ALSO
Что нужно освоить(по порядку),чтобы стать системным программистом и какие качества желательны,а также сколько времени в среднем занимает? [требует правки]

Что нужно освоить(по порядку),чтобы стать системным программистом и какие качества желательны,а также сколько времени в среднем занимает? [требует правки]

Что нужно освоить(по порядку),чтобы стать системным программистом и какие качества желательны,а также сколько времени в среднем занимает?

214
C++ текст в окне не обновляется

C++ текст в окне не обновляется

Добрый деньУ меня есть окно со списком и текстовое поле

240
Написать метод emplace для контейнера list

Написать метод emplace для контейнера list

Не знаю как написать метод emplace для листаВот мой лист:

328