IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Signification de typename


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Signification de typename
    Bonjour,

    Dans l'un de ses livres, Scott Meyers nous parle de la signification du mot clé typename (itme 42). Il nous dit que typename permet de préciser au compilateur la présence d'un type dépendant d'un template, afin que le compilateur ne le confonde pas avec une variable locale.

    Il donne alors l'exemple suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename C>
    void print2nd(const C& container)               // container;
    {                                              // this is not valid C++!
      if (container.size() >= 2) {
      C::const_iterator iter(container.begin()); // get iterator to 1st element
      ++iter;                                    // move iter to 2nd element
      int value = *iter;                         // copy that element to an int
      std::cout << value;                        // print the int
      }
    }
    Ici, le type dépendant (de C ) est bien sûr const_iterator.

    Il semble évident que C::const_iterator soit un type "iterator", et que donc que iter soit un iterator.

    Mais cela est évident pour le lecteur, pas pour le compilateur. (en effet, cela pourrait très bien être une variable statique de la classe C).

    Le problème est qu'au moment de la compilation, C n'est pas connu, et il n'y a aucun moyen de savoir si oui ou non C possède bien un type "const_iterator".

    De ce fait, il est nécessaire de mettre le mot clé typename devant C::const_iterator.




    Cependant, je viens d'essayer avec VC2010,et le compilateur accepte parfaitement le code ci-dessus. Il ne renvoie pas d'erreur, qu'il y ait typename ou non.

    Alors la question que je me pose est la suivante:
    Au moment ou Scott Meyers à écrit ce livre, les compilateurs présentaient encore de ce genre de problèmes, mais maintenant, il est possible que les compilateurs savent parfaitement résoudre ce genre d'ambiguïté.



    Merci.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Bonjour,

    Dans l'un de ses livres, Scott Meyers nous parle de la signification du mot clé typename (itme 42). Il nous dit que typename permet de préciser au compilateur la présence d'un type dépendant d'un template, afin que le compilateur ne le confonde pas avec une variable locale.

    Il donne alors l'exemple suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename C>
    void print2nd(const C& container)               // container;
    {                                              // this is not valid C++!
      if (container.size() >= 2) {
      C::const_iterator iter(container.begin()); // get iterator to 1st element
      ++iter;                                    // move iter to 2nd element
      int value = *iter;                         // copy that element to an int
      std::cout << value;                        // print the int
      }
    }
    Ici, le type dépendant (de C ) est bien sûr const_iterator.

    Il semble évident que C::const_iterator soit un type "iterator", et que donc que iter soit un iterator.

    Mais cela est évident pour le lecteur, pas pour le compilateur. (en effet, cela pourrait très bien être une variable statique de la classe C).

    Le problème est qu'au moment de la compilation, C n'est pas connu, et il n'y a aucun moyen de savoir si oui ou non C possède bien un type "const_iterator".

    De ce fait, il est nécessaire de mettre le mot clé typename devant C::const_iterator.




    Cependant, je viens d'essayer avec VC2010,et le compilateur accepte parfaitement le code ci-dessus. Il ne renvoie pas d'erreur, qu'il y ait typename ou non.

    Alors la question que je me pose est la suivante:
    Au moment ou Scott Meyers à écrit ce livre, les compilateurs présentaient encore de ce genre de problèmes, mais maintenant, il est possible que les compilateurs savent parfaitement résoudre ce genre d'ambiguïté.



    Merci.
    Non, ça vient uniquement du fait que le compilateur de Microsoft ne suit pas le standard C++ pour tout ce qui concerne la compilation des templates. Normallement, le code template doit être valide hors de toute instanciation - pour vérifier ce point, il est censé être précompilé et validé hors de toute instanciation. Ce point était nécessaire pour implémenter le comportement du mot-clef export dans les compilateurs - mais à ma connaissance, un seul compilateur le fait correctement (Commeau C++).

    Visual C++ ne fait pas ça - mais ne compile le code template que si il est instancié. A ce moment, le type C est connu, et le compilateur n'a aucun mal à voir que C::const_iterator existe et que c'est un type.

    Au niveau du programmeur, ça ne change pas grand chose - si ce n'est ce point particulier et quelques petits autres trucs qui ne sont pas piqués des vers (mais qui servent principalement (et très rarement) aux fondus de code impossible à lire - comme moi par exemple).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Au moment ou Scott Meyers à écrit ce livre, les compilateurs présentaient encore de ce genre de problèmes, mais maintenant, il est possible que les compilateurs savent parfaitement résoudre ce genre d'ambiguïté.
    La situation est plutôt inverse. Historiquement, les compilateurs n'avaient pas besoin de typename. Mais lors de la normalisation, on l'a rendu nécessaire. Ça fait partie de la recherche des noms en deux phases qui a été introduite pour:
    - qu'il soit moins facile d'enfreindre l'ODR avec les templates;
    - permettre de détecter des erreurs dans les templates lors de la définition des templates;
    - résoudre certaines ambiguités (il me semble me souvenir; je n'ai pas d'exemples)
    - permettre export (qui augmente la nécessité des deux premiers points, et il n'est pas impossible que le troisième ne soit qu'avec export)

    Outre l'utilisation de typename et template pour qualifier les noms dépendants, la recherche des noms en deux phases a changé la manière dont les noms dans les templates étaient résolus; parfois créant des erreurs, parfois changeant le résultat; par exemple pour accéder à un membre d'une base si la base est dépendante d'un paramètre template, il faut rendre ce nom dépendant (un cas où this-> peut être obligatoire).

    Ça ne m'étonnerait pas que VC++ ne l'ait toujours pas implémenté ou qu'elle ne soit pas activée par défaut.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/09/2004, 12h01
  2. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58
  3. Réponses: 4
    Dernier message: 22/01/2004, 08h27
  4. Recherche la signification d'expressions en C
    Par sbadecoder dans le forum C
    Réponses: 16
    Dernier message: 20/08/2003, 07h35
  5. i386, x86 signification ?
    Par Thcan dans le forum Assembleur
    Réponses: 7
    Dernier message: 04/01/2003, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo