Allez, encore moi... A chaque fois que je tente un truc ça déraille (et
j'ai beau lire la doc en ligne j'ai pas trouvé).
Pour faire tout bien je voudrais utiliser des namespaces.
J'en ai déjà défini un (glib:S2D) qui roule tout seul et là j'ai un
problème avec une enum dans un autre namespace (glib::sys)
La ligne ci dessus provoque 3 erreurs successives :
1) 'glib::sys::eventTypes::evt_KeyStillDown' : impossible de former un
nom qualifié
2) 'evt_KeyStillDown' : n'est pas membre de 'operator``global
namespace'''
3) 'glib::sys::eventTypes' : utilisation non conforme de ce type comme
expression
4) erreur de syntaxe : absence de ';' avant l'identificateur
'evt_KeyStillDown'
Je comprends pas pourquoi... Y a-t-il une explication logique ??
La même ligne sans "eventTypes::". Le nom de l'enum est juste utilisé pour identifier le type et y faire référence, pas pour utiliser ses éléments.
Vincent
-- vmime, une bibliothèque C++ sous licence GPL pour parser et générer des messages au format MIME : http://www.sourceforge.net/projects/vmime/
Jean-Marc Molina
Je comprends pas pourquoi... Y a-t-il une explication logique ??
Comme te l'a dit Vincent tu ne peux pas utiliser le nom de l'enum pour accéder aux éléments de cette structure. Par contre tu peux utiliser quelques design patterns pour encapsuler ton enum : - Déjà ton enum devrait être dans la classe Event et non pas dans le namespace sys - À partir de là tu dois normalement pouvoir y accéder par un Event::evt_Unknown - Pas besoin de préfixer tes attributs par un préfixe evt, l'enum est "encapsulé" dans une classe ce qui évite toutes les formes de conflits, ça donne : Event::Unknown - Si il était en global tu pourrais l'encapsuler dans une structure struct : struct Event_Types { Unknown, AppExit... et y accéder comme pour une classe : Event_Types::AppExit - Je ne suis pas certain que c'est ANSI mais si il est dans une classe l'enum devient une sorte de namespace (du moins sous Visual C++) tu peux alors accéder aux attributs : Event (classe)::eventTypes (enum)::evt_AppExit - Ce qui nous donne, une fois chaque objet correctement nommé (sans préfixe ni artifice :p) : Event::Types::AppExit (l'événement de type AppExit et pas l'événement AppExit de types eventTypes de la classe Event). Logique d'écriture : espace de nom::classe::enum::attribut (aucun conflit)
Si quelqu'un peut tester ces solutions avec d'autres compilateurs, je suis preneur des résultats.
Euh finalement je parlais de Design Patterns, il s'agit d'une technique Java pour gérer un enum par l'intermédiaire d'une classe, mais en C on dispose des enums et comme on parle de C++, il nous suffit de l'encapsuler tout bêtement. Ça peut paraître un peu crado pour les Oopuristes (les Javaïens ou les Smalltalkians ^^) mais on est sur un newsgroup C++ oui ou non ??!! ^^'
JM
-- Europe > France > Lyon Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)
Je comprends pas pourquoi... Y a-t-il une explication logique ??
Comme te l'a dit Vincent tu ne peux pas utiliser le nom de l'enum pour
accéder aux éléments de cette structure.
Par contre tu peux utiliser quelques design patterns pour encapsuler ton
enum :
- Déjà ton enum devrait être dans la classe Event et non pas dans le
namespace sys
- À partir de là tu dois normalement pouvoir y accéder par un
Event::evt_Unknown
- Pas besoin de préfixer tes attributs par un préfixe evt, l'enum est
"encapsulé" dans une classe ce qui évite toutes les formes de conflits, ça
donne : Event::Unknown
- Si il était en global tu pourrais l'encapsuler dans une structure struct :
struct Event_Types { Unknown, AppExit... et y accéder comme pour une classe
: Event_Types::AppExit
- Je ne suis pas certain que c'est ANSI mais si il est dans une classe
l'enum devient une sorte de namespace (du moins sous Visual C++) tu peux
alors accéder aux attributs : Event (classe)::eventTypes
(enum)::evt_AppExit - Ce qui nous donne, une fois chaque objet correctement
nommé (sans préfixe ni artifice :p) : Event::Types::AppExit (l'événement de
type AppExit et pas l'événement AppExit de types eventTypes de la classe
Event). Logique d'écriture : espace de nom::classe::enum::attribut (aucun
conflit)
Si quelqu'un peut tester ces solutions avec d'autres compilateurs, je suis
preneur des résultats.
Euh finalement je parlais de Design Patterns, il s'agit d'une technique Java
pour gérer un enum par l'intermédiaire d'une classe, mais en C on dispose
des enums et comme on parle de C++, il nous suffit de l'encapsuler tout
bêtement. Ça peut paraître un peu crado pour les Oopuristes (les Javaïens ou
les Smalltalkians ^^) mais on est sur un newsgroup C++ oui ou non ??!! ^^'
JM
--
Europe > France > Lyon
Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)
Je comprends pas pourquoi... Y a-t-il une explication logique ??
Comme te l'a dit Vincent tu ne peux pas utiliser le nom de l'enum pour accéder aux éléments de cette structure. Par contre tu peux utiliser quelques design patterns pour encapsuler ton enum : - Déjà ton enum devrait être dans la classe Event et non pas dans le namespace sys - À partir de là tu dois normalement pouvoir y accéder par un Event::evt_Unknown - Pas besoin de préfixer tes attributs par un préfixe evt, l'enum est "encapsulé" dans une classe ce qui évite toutes les formes de conflits, ça donne : Event::Unknown - Si il était en global tu pourrais l'encapsuler dans une structure struct : struct Event_Types { Unknown, AppExit... et y accéder comme pour une classe : Event_Types::AppExit - Je ne suis pas certain que c'est ANSI mais si il est dans une classe l'enum devient une sorte de namespace (du moins sous Visual C++) tu peux alors accéder aux attributs : Event (classe)::eventTypes (enum)::evt_AppExit - Ce qui nous donne, une fois chaque objet correctement nommé (sans préfixe ni artifice :p) : Event::Types::AppExit (l'événement de type AppExit et pas l'événement AppExit de types eventTypes de la classe Event). Logique d'écriture : espace de nom::classe::enum::attribut (aucun conflit)
Si quelqu'un peut tester ces solutions avec d'autres compilateurs, je suis preneur des résultats.
Euh finalement je parlais de Design Patterns, il s'agit d'une technique Java pour gérer un enum par l'intermédiaire d'une classe, mais en C on dispose des enums et comme on parle de C++, il nous suffit de l'encapsuler tout bêtement. Ça peut paraître un peu crado pour les Oopuristes (les Javaïens ou les Smalltalkians ^^) mais on est sur un newsgroup C++ oui ou non ??!! ^^'
JM
-- Europe > France > Lyon Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)