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 :
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;
Résultat : erreur: duplicate initialization of ‘Color<VIDEO_PIXELFORMAT_R5G6B5>::BytesPerPixel’

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 :
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];
};
Mais erreur à la ligne qui commence par "template<>" : erreur: explicit specialization in non-namespace scope ‘class Color<TFormat>’

J'ai donc essayé de sortir ce truc :
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; }
(à noter que j'ai essayé des dizaines de combinaisons pour le truc en dehors avant d'en arriver là)

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