Russian Qt Forum
Ноябрь 26, 2024, 05:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QMap в QDataStream  (Прочитано 11187 раз)
merke
Гость
« : Июнь 20, 2011, 17:16 »

Всем привет.

К примеру есть такая структура:

Код:
struct my_struct
{
    int a;
    int b;
};

И есть карта следующего вида:

Код:
QMap<QString, my_struct> mapMain;

Потом я хочу проделать следующее:

 
Код:
   QByteArray arr;
    QDataStream stream(&arr, QIODevice::WriteOnly);
    stream.setVersion(QDataStream::Qt_4_7);

    my_struct udt;

    udt.a = 1;
    udt.b = 2;

    mapMain.insert("Hello", udt);

    stream << mapMain;

Компилятор на это говорит очень сильным и громким матом:

Код:
C:\dev\est_strucrt-build-desktop\..\..\Qt\2010.05\qt\src\corelib\io\qdatastream.h:427: ошибка: no match for 'operator<<' in 'operator<<(((QDataStream&)((QDataStream*)out)), ((const QString&)((const QString*)it.QMap<Key, T>::const_iterator::key [with Key = QString, T = my_struct]()))) << it.QMap<Key, T>::const_iterator::value [with Key = QString, T = my_struct]()'

Далее делаю вот это:

 
Код:
  friend QDataStream &operator<<(QDataStream &out, const QMap<QString, my_struct> &map)
    {
        //Тут код :)
        return out;
    }

И всё равно ругается. Как же запихать карту в датастрим?

Помогите, пожалуйста!!!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 20, 2011, 17:25 »

не надо никаких френдов - лучше вне класса опиши эту функцию
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
BRE
Гость
« Ответ #2 : Июнь 20, 2011, 17:25 »

Ты "научи" QDataStream структуру my_struct сохранять, а с остальным он сам разберется.   Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 20, 2011, 17:26 »

мы ж не видим какой там код в "Тут код" - может поля структуры явно считываются Подмигивающий
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
merke
Гость
« Ответ #4 : Июнь 20, 2011, 17:31 »

"Тут код"=)

Код:
 friend QDataStream &operator<<(QDataStream &out, const QMap<QString, my_struct> &map)
    {

        QMapIterator<QString, my_struct> iter(map);
        while(iter.hasNext())
        {
            iter.next();
            out << iter.key();
            out << iter.value().a;
            out << iter.value().b;
        }
        return out;
    }

Объявил за классом один фиг также.

Научить просто структуру записывать уже научил) но хочется чтобы скинуть ему карту, а тот уже сам.
Записан
merke
Гость
« Ответ #5 : Июнь 20, 2011, 17:40 »

Интересно... если нажать на ошибку то переходит в файл QDataStream.h и там вот такой кол:

Код:
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QMap<Key, T> &map)
{
    out << quint32(map.size());
    typename QMap<Key, T>::ConstIterator it = map.end();
    typename QMap<Key, T>::ConstIterator begin = map.begin();
    while (it != begin) {
        --it;
        out << it.key() << it.value();
    }
    return out;
}

Значит это уже реализовано???
Записан
merke
Гость
« Ответ #6 : Июнь 20, 2011, 17:57 »

SOS SOS SOS!!! Please, help me! Смеющийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Июнь 20, 2011, 18:06 »

Код
C++ (Qt)
QDataStream &operator<<(QDataStream &out, const my_struct &struct)
{
   out << struct.a;
   out << struct.b;
   return out;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
merke
Гость
« Ответ #8 : Июнь 20, 2011, 18:11 »

Спасибо, но так уже делал... работает да)
Записан
merke
Гость
« Ответ #9 : Июнь 20, 2011, 18:15 »

Я просто делал вот так:

Код:
QByteArray arr;
QDataStream stream(&arr, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_7);

QMapIterator<QString, my_struct> iter(mapMain);
        while(iter.hasNext())
        {
            iter.next();

            stream << iter.key();
            stream << iter.value();
        }

Я посчитал, что это не красивая реализация, и подумал о том, почему бы сразу не скормить ему карту. оказывается так просто это не сделать, а жаль...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Июнь 20, 2011, 18:36 »

Интересно... если нажать на ошибку то переходит в файл QDataStream.h и там вот такой кол:

Код:
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QDataStream &operator<<(QDataStream &out, const QMap<Key, T> &map)
{
    out << quint32(map.size());
    typename QMap<Key, T>::ConstIterator it = map.end();
    typename QMap<Key, T>::ConstIterator begin = map.begin();
    while (it != begin) {
        --it;
        out << it.key() << it.value();
    }
    return out;
}

Значит это уже реализовано???

it.value() - это и есть my_struct. 
Очевидно, что для my_struct  должен быть реализован оператор <<
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
merke
Гость
« Ответ #11 : Июнь 20, 2011, 18:42 »

О здорово, заработало)))

Да, оказывается если просто для структуры, переопределить оператор << то и карту можно уже передавать!!! как здорово!!! спасибо!!!!!!!!!!!!!!!!!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 20, 2011, 18:48 »

Очевидно, что для my_struct  должен быть реализован оператор <<
Ну это и для меня очевидно Улыбающийся А вот пара моментов что нет, и было бы интересно узнать (углУбить свои знания)

- зачем QMap пишется задом наперед ?
- в чем "глубинный смысл" typename QMap<.. чем хуже (или почему нельзя) без typename ?

Спасибо
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #13 : Июнь 20, 2011, 19:04 »

Очевидно, что для my_struct  должен быть реализован оператор <<
Ну это и для меня очевидно Улыбающийся А вот пара моментов что нет, и было бы интересно узнать (углУбить свои знания)

- зачем QMap пишется задом наперед ?
- в чем "глубинный смысл" typename QMap<.. чем хуже (или почему нельзя) без typename ?

Спасибо

1)Почему QMap задом наперёд.. Не знаю, есть ли в этом какой-нить сокральный смысл, нужно смотреть реализацию QDataStream. Возможно это и не спроста)

2) typename нужно писать, поскольку ConstIterator - есть некий вложенный идентификатор и без typename нельзя было бы создать объект it:
Код
C++ (Qt)
typename QMap<Key, T>::ConstIterator it = map.end();
 
Чтоб компилятор не гадал что это: статическая переменная класса или вложенный тип, как в примере выше.
Как то так)
 
« Последнее редактирование: Июнь 20, 2011, 19:09 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ритт
Гость
« Ответ #14 : Июнь 20, 2011, 19:56 »

О здорово, заработало)))

Да, оказывается если просто для структуры, переопределить оператор << то и карту можно уже передавать!!! как здорово!!! спасибо!!!!!!!!!!!!!!!!!

о, боже, боже...гениально!

...а потом открываем ассистант - и видим, что них оно не гениально, а вполне даже так и должно быть:
Цитировать
Reading and writing Qt collection classes

The Qt container classes can also be serialized to a QDataStream. These include QList, QLinkedList, QVector, QSet, QHash, and QMap. The stream operators are declared as non-members of the classes.

и
http://doc.trolltech.com/latest/qmap.html#operator-lt-lt-82
Цитировать
QDataStream & operator<< ( QDataStream & out, const QMap<Key, T> & map )

Writes the map map to stream out.

This function requires the key and value types to implement operator<<().

See also Format of the QDataStream operators.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.