Utilisation d'un typedef d'un énuméré dans une classe template
12 réponses
Pascal Béthune
Bonjour,
Soit le code suivant:
class MyValueTrait
{
public:
enum ValueEnum { A, B, C, D, END };
};
template < class ValueTrait >
class Collection
{
public:
typedef typename ValueTrait::ValueEnum ValueEnum;
int & operator[]( ValueEnum valueEnum )
{
// source simplifié pour le post
return value_;
}
int value_;
};
L'instantiation du template ne pose pas de problème:
int main()
{
Collection< MyValueTrait > collection;
L'utilisation de la méthode en utilisant l'énuméré de la classe
MyValueTrait ne pose pas de problème non plus:
collection[ MyValueTrait::A ] = 3;
Mais, si j'utilise l'énuméré de la classe template, ça ne fonctionne pas:
collection[ Collection< MyValueTrait >::A ] = 3; // ligne 37
return 0;
}
J'ai le message suivant (gcc 3.3.3 sur fedora core 2):
g++ -Wall -ansi -o extrait extrait.cpp
extrait.cpp: Dans function « int main() »:
extrait.cpp:37: error: `A' is not a member of type
`Collection<MyValueTrait>'
Pourquoi le typedef de la classe Collection ne me permet t-il pas
d'écrire cela ? Y a t-il un autre moyen de faire ? Est-ce un
bug/limitation de gcc ?
Pourquoi le typedef de la classe Collection ne me permet t-il pas d'écrire cela ?
Parce que typedef introduit un synonyme et ne fait rien d'autre.
Est-ce un bug/limitation de gcc ?
Non.
Y a t-il un autre moyen de faire ?
L'objectif donc est que les noms déclarés dans MyValueTraits soient disponibles de manière non qualifiée dans Collection? C'est assez simple: faire hériter Collection de MyValueTraits:
class Collection: public ValueTrait
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pascal Béthune <nospam@nospam.fr> writes:
Pourquoi le typedef de la classe Collection ne me permet t-il pas d'écrire
cela ?
Parce que typedef introduit un synonyme et ne fait rien
d'autre.
Est-ce un bug/limitation de gcc ?
Non.
Y a t-il un autre moyen de faire ?
L'objectif donc est que les noms déclarés dans MyValueTraits
soient disponibles de manière non qualifiée dans Collection?
C'est assez simple: faire hériter Collection de
MyValueTraits:
class Collection: public ValueTrait
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pourquoi le typedef de la classe Collection ne me permet t-il pas d'écrire cela ?
Parce que typedef introduit un synonyme et ne fait rien d'autre.
Est-ce un bug/limitation de gcc ?
Non.
Y a t-il un autre moyen de faire ?
L'objectif donc est que les noms déclarés dans MyValueTraits soient disponibles de manière non qualifiée dans Collection? C'est assez simple: faire hériter Collection de MyValueTraits:
class Collection: public ValueTrait
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pascal Béthune
Jean-Marc Bourguet wrote:
Y a t-il un autre moyen de faire ?
L'objectif donc est que les noms déclarés dans MyValueTraits soient disponibles de manière non qualifiée dans Collection? C'est assez simple: faire hériter Collection de MyValueTraits:
class Collection: public ValueTrait
C'est LA solution à mon problème (j'étais focalisé sur une solution "typedef" en oubliant d'autre façon de faire).
La classe template Collection fournit alors à ses utilisateurs le type énuméré ainsi que ses valeurs, mais fournit "naturellement" la façon d'instancier le "bon" objet grace à la fonction statique instanciateValue() ce qui ouvre d'autre possibilités fort interessantes.
Merci. :)
-- Pascal
Jean-Marc Bourguet wrote:
Y a t-il un autre moyen de faire ?
L'objectif donc est que les noms déclarés dans MyValueTraits
soient disponibles de manière non qualifiée dans Collection?
C'est assez simple: faire hériter Collection de
MyValueTraits:
class Collection: public ValueTrait
C'est LA solution à mon problème (j'étais focalisé sur une solution
"typedef" en oubliant d'autre façon de faire).
La classe template Collection fournit alors à ses utilisateurs le type
énuméré ainsi que ses valeurs, mais fournit "naturellement" la façon
d'instancier le "bon" objet grace à la fonction statique
instanciateValue() ce qui ouvre d'autre possibilités fort interessantes.
L'objectif donc est que les noms déclarés dans MyValueTraits soient disponibles de manière non qualifiée dans Collection? C'est assez simple: faire hériter Collection de MyValueTraits:
class Collection: public ValueTrait
C'est LA solution à mon problème (j'étais focalisé sur une solution "typedef" en oubliant d'autre façon de faire).
La classe template Collection fournit alors à ses utilisateurs le type énuméré ainsi que ses valeurs, mais fournit "naturellement" la façon d'instancier le "bon" objet grace à la fonction statique instanciateValue() ce qui ouvre d'autre possibilités fort interessantes.