Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation d'un typedef d'un énuméré dans une classe template

12 réponses
Avatar
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 ?


-- Pascal

2 réponses

1 2
Avatar
Jean-Marc Bourguet
Pascal Béthune 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

Avatar
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


1 2