Сериализация Qt не соответствует оператору << типы операндов 'QDataStream' - PullRequest
0 голосов
/ 23 ноября 2018

У меня проблема во время сериализации с простой управляемой структурой.

Мой заголовок класса

class MappySaver
{

public:
    MappySaver();

    //structure
    struct Tile
    {
    public:
        int ID;
        int x,y,w,h;
        QRect rect;
    };

    QList<Tile> Tiles;
    QObject t;
    Tile tile;

};

QDataStream& operator << (QDataStream& s, const MappySaver::Tile& tile);
QDataStream& operator >> (QDataStream& s, MappySaver::Tile& tile);


#endif // MAPPYSAVER_H

и источник cpp

   QDataStream &operator<<(QDataStream &s, const MappySaver::Tile& tile)
{
    s << tile;
    return s;
}

Когда я пытаюсь скомпилироватьвот, я получаю эту ошибку:

ошибка: нет совпадения для 'operator <<' (типы операндов: 'QDataStream' и 'const MappySaver :: Tile') </p>

template <typename T> //QDataStream.h
QDataStream& operator<<(QDataStream& s, const QList<T>& l)
{
    s << quint32(l.size());
    for (int i = 0; i < l.size(); ++i)
        s << l.at(i);
    return s;
}

Я использую этот класс для сериализации списка.В основной форме у меня есть виджет с теми же данными.

И я использую этот метод для попытки сериализации.

QString filename = QFileDialog::getSaveFileName(this,
                                                tr("Seleziona il file da salvare"),"",
                                            tr("File Mappa (*.mp2d)"));

MappySaver::Tile t;
    MappySaver m;


    for(int i = 0; i < ui->maps->Tiles.count(); i++)
    {
        t.ID = ui->maps->Tiles[i].ID;
        t.h = ui->maps->Tiles[i].h;
        t.rect = ui->maps->Tiles[i].rect;
        t.w = ui->maps->Tiles[i].w;
        t.x = ui->maps->Tiles[i].x;
        t.y = ui->maps->Tiles[i].y;

        m.Tiles.append(t);
    }



        QFile f(filename);

         if(!f.open(QIODevice::WriteOnly))
         {

         }else
         {
             QDataStream out(&f);
             out.setVersion(QDataStream::Qt_4_8);

             out << m.Tiles;

         }

        f.flush();
        f.close();

Как я могу исправить эту проблему и сериализовать?

...