Bonjour à tous,
J'ai un problème lors de l'utilisation de l'opérateur<< avec un QDataStream quand le type sérialisé est une QList de classes personnalisées.

Le code concerné est ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef TILEINFOMESSAGE_H_
#define TILEINFOMESSAGE_H_
 
#include "AbstractMessage.h"
#include <common.h>
#include <QMetaType>
#include <QPoint>
#include <QList>
#include "StaticObjectInfoMessage.h"
 
namespace protocol {
 
class COMMONSHARED_EXPORT TileInfoMessage : public AbstractMessage
{
public:
	TileInfoMessage();
	~TileInfoMessage();
	QPoint & tilePos();
	void setTilepos(QPoint);
	qint32 & altitude();
	void setAltitude(qint32);
	QList<protocol::StaticObjectInfoMessage > & staticObjects();
	void setStaticobjects(QList<protocol::StaticObjectInfoMessage >);
	qint8 & walkable();
	void setWalkable(qint8);
	QString messageName();
	qint32 messageId();
	void serializeInto(QDataStream &);
	void unserializeFrom(QDataStream &);
 
private:
	QPoint _tilePos;
	qint32 _altitude;
	QList<protocol::StaticObjectInfoMessage > _staticObjects;
	qint8 _walkable;
};
 
}
 
Q_DECLARE_METATYPE(protocol::TileInfoMessage)
 
QDataStream &operator<<(QDataStream &, protocol::TileInfoMessage &);
QDataStream &operator>>(QDataStream &, protocol::TileInfoMessage &);
 
#endif /* TILEINFOMESSAGE_H_ */
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
//Ceci est la ligne 28 (l'extrait de code commence donc ligne 29)
void TileInfoMessage::serializeInto(QDataStream & stream)
{
	TileInfoMessage message = *this; 
	stream << message.tilePos();
	stream << message.altitude();
	stream << message.staticObjects();
	stream << message.walkable();
}
Tous les fichiers sont générés par un script donc protocol::StaticObjectInfoMessage est identique à protocol::TileInfoMessage mis a part les getters/setters et les attributs private.

Le compilateur me renvoie vers des lignes de code de Qt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
In file included from c:\Qt\Desktop\Qt\4.7.4\mingw\include\QtCore/QDataStream:1,
                 from ..\..\src\common\game\protocol\/AbstractMessage.h:5,
                 from ..\..\src\common\game\protocol\/TileInfoMessage.h:4,
                 from ..\..\src\common\game\protocol\TileInfoMessage.cpp:1:
c:\Qt\Desktop\Qt\4.7.4\mingw\include\QtCore/qdatastream.h: In function 'QDataStream& operator<<(QDataStream&, const QList<T>&) [with T = protocol::StaticObjectInfoMessage]':
..\..\src\common\game\protocol\TileInfoMessage.cpp:34:   instantiated from here
c:\Qt\Desktop\Qt\4.7.4\mingw\include\QtCore/qdatastream.h:263: error: no match for 'operator<<' in 's << ((const QList<protocol::StaticObjectInfoMessage>*)l)->QList<T>::at [with T = protocol::StaticObjectInfoMessage](i)'
c:\Qt\Desktop\Qt\4.7.4\mingw\include\QtCore/qdatastream.h:156: note: candidates are: [...]
Je ne voit pas d'où vient ce problème sachant que c'est un problème à la compilation et non à l’exécution (donc qRegisterMetaTypeStreamOperators ou les autres fonctions de QMetaType ne changent rien)

Merci d'avance pour votre aide !