Bonjour,
J'ai un petit type enum (en C) qui liste les formats vidéo possibles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef enum video_pixelFormat { VIDEO_PIXELFORMAT_8BITSPALETTE, VIDEO_PIXELFORMAT_R5G5B5, VIDEO_PIXELFORMAT_R5G6B5, VIDEO_PIXELFORMAT_R8G8B8, VIDEO_PIXELFORMAT_R8G8B8A8 } video_pixelFormat;
Et là je suis en train d'essayer de créer une template classe "Color" qui prendrait comme paramètre de template l'un de ces formats.
En gros ce que je veux faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Color<VIDEO_PIXELFORMAT_R5G5B5> couleur(255, 190, 0); *memoireVideo = couleur;
Mais j'essaye en long en large et en travers, j'arrive pas à compiler ce foutu truc :-/
Mon problème vient de la détermination du nombre d'octets formant un pixel.
J'ai d'abord essayé ça :
Résultat : erreur: duplicate initialization of ‘Color<VIDEO_PIXELFORMAT_R5G6B5>::BytesPerPixel’
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template<video_pixelFormat TFormat> class Color { static const int BytesPerPixel = 0; unsigned char _data[BytesPerPixel]; }; template<> const int Color<VIDEO_PIXELFORMAT_R5G6B5>::BytesPerPixel = 2;
Si j'enlève le "=0" il ne veut pas créer le tableau _data : erreur: array bound is not an integer constant.
J'ai donc essayé de créer une template struct à l'intérieur de ma template class :
Mais erreur à la ligne qui commence par "template<>" : erreur: explicit specialization in non-namespace scope ‘class Color<TFormat>’
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template<video_pixelFormat TFormat> class Color { template<video_pixelFormat TFormat2> struct DataSize { static const int Size = 0; }; template<> struct DataSize<VIDEO_PIXELFORMAT_R5G6B5> { static const int Size = 2; } static const int BytesPerPixel = DataSize<TFormat>::Size; unsigned char _data[BytesPerPixel]; };
J'ai donc essayé de sortir ce truc :
(à noter que j'ai essayé des dizaines de combinaisons pour le truc en dehors avant d'en arriver là)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template<video_pixelFormat TFormat> class Color { template<video_pixelFormat TFormat2> struct DataSize { static const int Size = 0; }; static const int BytesPerPixel = DataSize<TFormat>::Size; unsigned char _data[BytesPerPixel]; }; template<> template<> struct Color<VIDEO_PIXELFORMAT_R5G6B5>::DataSize<VIDEO_PIXELFORMAT_R5G6B5> { static const int Size = 2; }
Mais : erreur: redefinition of ‘struct Color<VIDEO_PIXELFORMAT_R5G6B5>:ataSize<VIDEO_PIXELFORMAT_R5G6B5>’
Et là je commence à faire une overdose... pas moyen de faire comprendre à ce foutu compilateur ce que je veux...
Donc si un expert en templates pouvait me donner un petit coup de mains, ce serait sympa
EDIT : je sais qu'en sortant "DataSize" de "Color" ça va très certainement marcher, mais cette solution ça ressemble à du système D ; au delà du fait que ça fonctionne je voudrais un truc propre
Partager