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 !
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"meow" <schwarz.ben@gmail.com> 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
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
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
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
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
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 ?
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 ?
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 ?
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
"meow" <schwarz.ben@gmail.com> 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
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
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
Jean-Marc Bourguet wrote:
"meow" <schwarz.ben@gmail.com> 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
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
meow
Merci pour vos réponse, comme toujours éclairantes.
Merci pour vos réponse, comme toujours éclairantes.