OVH Cloud OVH Cloud

utilisation du mot clef "template"

6 réponses
Avatar
meow
Bonjour,

dans une bibliotheque j'ai trouv=E9 =E7a :


template < class Items>
class P_derived_items {
public:
template < class Refs, class Traits>
class V_wrapper {
public:
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
[=2E.]
}

Et je ne comprends pas la ligne :
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
.=2E.Mais alors pas du tout !

6 réponses

Avatar
Jean-Marc Bourguet
"meow" writes:

Bonjour,

dans une bibliotheque j'ai trouvé ça :


template < class Items>
class P_derived_items {
public:
template < class Refs, class Traits>
class V_wrapper {
public:
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
[..]
}

Et je ne comprends pas la ligne :
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
...Mais alors pas du tout !


On aimerait ecrire
typedef Items::V_wrapper<Refs, Traits> VWrap;
mais V_wrapper est qualifie par le nom d'un parametre template, donc
il faut le qualifier avec template puisqu'il est un template et avec
typename puisqu'il definit un type.

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
kanze
meow wrote:

dans une bibliotheque j'ai trouvé ça :

template < class Items>
class P_derived_items {
public:
template < class Refs, class Traits>
class V_wrapper {
public:
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
[..]
}

Et je ne comprends pas la ligne :
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
...Mais alors pas du tout !


C'est qu'on veut que le compilateur puisse vérifier la syntaxe
du template lorsqu'il en voit la définition, sans savoir comment
il va être instantié. Or, malheureusement, la syntaxe du C++
n'est pas « context free ». Pour commencer, comment parser une
instruction peut changer radicalement selon qu'un symbole
utilisateur soit le nom d'un type ou non. Alors, on décrète que
par défaut, ce n'est pas le nom d'un type, et quand un nom
qualifié doit être un nom d'un type, il faut le dire au
compilateur. Donc, le typename. Ensuite, il y a la question de
la signification du '<' qui suit V_wrapper. La règle générale
veut que ce soit un « inférieur à », sauf s'il est précédé du
nom d'un template. Ici aussi, tant que le compilateur n'a pas
instantié le template, comment peut-il le savoir. Alors, on lui
le dit.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
meow
D'abord, merci à vous pour vos réponses empressées :)
Bon... Comme d'hab les réponses soulèvent autant de questions :)
0.) commençons par voir si j'ai compris :
typedef typename Items::template V_wrapper<Refs,Traits> VWrap;
je déclare un second nom (VWrap) pour un autre type.
Cet autre type (et c'est bien un type Mr le compilo je vous l'assure
(cf typename), et ce malgrès le fait que je le déréférencie de
Items qui est un argument template et qui vous interdit donc d'aller le
vérifier vous meme.) n'est autre que Items::V_wrapper<Refs,Traits>
En outre, j'attire votre attention, Mr le compilo, sur le fait que
<Refs,Traits> est un paramétrage template de V_wrapper.

Première question/remarque en rapport dirrect avec ceci :
1.) "typename blah inférieur à" aurait-t'il un sens ? Ne pourrait
t'on pas s'attendre à ce que dans ce contexte "<" dénote un
paramètre template ? Idem pour le mot clef typedef d'ailleurs...

Puis rabattons nous sur les horreurs annexes :
2.) "nom qualifié" quesaquo ?
3.) je n'ai trouvé nulle part cette utilisation de "template" dans
tous mes tutoriaux et cours online, ni dans mon stroustrup 2nd ed (un
peu vieux peut etre)... Vous auriez des pointeurs ?
Avatar
Jean-Marc Bourguet
"meow" writes:

1.) "typename blah inférieur à" aurait-t'il un sens ? Ne
pourrait t'on pas s'attendre à ce que dans ce contexte "<"
dénote un paramètre template ? Idem pour le mot clef
typedef d'ailleurs...


Il est possible de s'en sortir dans certains cas (et
peut-être dans tous les cas) mais ça demande une utilisation
du contexte plus poussée que ce que l'on fait habituellement
dans un parseur.

Puis rabattons nous sur les horreurs annexes :
2.) "nom qualifié" quesaquo ?


A::B

3.) je n'ai trouvé nulle part cette utilisation de
"template" dans tous mes tutoriaux et cours online, ni
dans mon stroustrup 2nd ed (un peu vieux peut
etre)...


Il est fort faible sur les templates en général qui ont pas
mal évolué depuis.

Vous auriez des pointeurs ?


Le bouquin de Josutis & Vandevoorde.

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
kanze
Jean-Marc Bourguet wrote:
"meow" writes:

1.) "typename blah inférieur à" aurait-t'il un sens ? Ne
pourrait t'on pas s'attendre à ce que dans ce contexte "<"
dénote un paramètre template ? Idem pour le mot clef typedef
d'ailleurs...


Il est possible de s'en sortir dans certains cas (et peut-être
dans tous les cas) mais ça demande une utilisation du contexte
plus poussée que ce que l'on fait habituellement dans un
parseur.


J'ajouterai que :

-- Il est extrèmement difficile à spécifier de façon exacte
quand on pourrait s'en sortir. Et c'est le genre de chose où
la norme n'a pas droit à l'erreur -- si elle dit que dand
tel et tel cas, on n'a pas besoin de typename, il faut que
le compilateur se debrouille pour ne pas en avoir besoin.
Même si c'est computationnellement impossible. Si en général,
on dit que la commodité de l'auteur du compilateur vient
derrière la commodité de l'utilisateur, on préfère quand
même qu'une implémentation soit possible.

-- Au niveau de l'apprentissage du langage, aussi, c'est plus
facile à dire simplement qu'il le faut, que d'essayer
d'enseigner les cas où on pourrait s'en passer. On a déjà
assez de cas où il faut déviner ce que fait le compilateur ;
ce n'est pas la peine d'en ajouter.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
meow
Merci pour vos réponse, comme toujours éclairantes.