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

Langage C++ Discussion :

Class interne dans une classe template


Sujet :

Langage C++

  1. #21
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Le C++ dit que ces noms ne désignent des types que si on les précède de typename; de même ils ne désignent des templates que si on les précède de template
    Ça serait donc là qu'il y aurait ambiguté...

    Mais si on écrit ça:
    ça corespond à quoi?


    Bon je crois que si vous avez un bon exemple pas trop compliqué (style relire le code source de la STL), qui me montres les ambigutés possibles, je suis preneur.

  2. #22
    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 MatRem
    Donc dans ce cas le typename ne sert à rien puisqu'il n'y plus ambiguté !?
    Désolé, il faut écrire:
    et typename est interdit.

    La norme en préparation va autorisé typename à un certain nombres d'endroit où pour le moment il est interdit. Je ne sais plus si ce cas en fait partie ou non.

    Ou un paramètre template...
    Parceque si à la suite de ma classe A template générale et de mes trois spécialisations j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    class C{
    private:
       typename A<T>::B b;
    };
    ça fonctionnera bien?
    Oui. typename est même obligatoire dans ce cas.

    D'ailleurs là la classe B sera choisie à l'instanciation d'une classe C, c'est bien ça?
    Oui.

    Donc ma question du jour "A quoi sert le mom clef typename dans ce cas puisque le compilateur sait forcément quoi choisir", me chagrine toujours
    A pouvoir analyser une définition de template sans connaître quels seront les types effectifs des paramètres. Si tu écris dans un fichier tout seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename T>
    class A;
     
    template <typename T>
    struct B {
      A<T>::C c;
    };
    Le compilateur doit refuser le code. Si tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename T>
    class A;
     
    template <typename T>
    struct B {
      typename A<T>::C c;
    };
    il doit accepter. La raison est que si on ne sait pas si un identificateur désigne un type (ou un template), ou autre chose, il est difficile pour un programme de faire une analyse syntaxique, parfois le résultat est même ambigu.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #23
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    template <typename T>
    class A;

    template <typename T>
    struct B {
    A<T>::C c;
    };
    Ici je comprends bien à quoi ça sert...
    Si on le met pas, il faut enlever c, et C est intérprétée comme une variable de A<T>, c'est bien ça?
    Enfin remarque comme on fait suivre A<T>::C par c, le compilateur devrait comprendre que c est une variable donc A<T>::C un type. Ils sont pas trés intelligents ces compilateurs .
    Sans doute qu'il doit y avoir des cas de syntaxe ou le compilateur ne pourrait pas comprendre... mais je ne vois pas lesquels.

    Par contre dans les exemples que j'ai donné, le type utilisé était bel et bien déclaré auparavant, d'où ma question. Pourquoi typename est obligatoire dans tout les cas, est ce un abut de la norme?

  4. #24
    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 MatRem
    Ils sont pas trés intelligents ces compilateurs
    Tu en fais un et on en reparle.

    Sans doute qu'il doit y avoir des cas de syntaxe ou le compilateur ne pourrait pas comprendre... mais je ne vois pas lesquels.
    Essaie de faire un analyseur syntaxique pour du C a base de yacc/bison sans utiliser un hack pour gérer les typedef et tu auras une idée des difficultés. La grammaire du C++ est bien plus complexe.

    Par contre dans les exemples que j'ai donné, le type utilisé était bel et bien déclaré auparavant, d'où ma question. Pourquoi typename est obligatoire dans tout les cas, est ce un abut de la norme?
    C'est plus simple de dire que typename est obligatoire dans tous les cas où le nom du type est dépendant d'un paramètre template que d'essayer de se limiter aux cas où il y a une ambiguité. Sans parler de la nécessité qu'il y aurait alors de s'assurer qu'il y a bien une ambiguité.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #25
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    J'ai a peu prés compris le fonctionement général des analyseurs de grammaire.
    Et c'est d'ailleurs pour ça que je me rends compte que la grammaire du c++ doit être très complexe à gérer .
    D'ailleurs je ne penses pas en faire un avant longtemps

    Bison et Yacc j'en ai un peu entendu parler... mais j'ai jamais eu l'occasion de regarder leur fonctionement.


    C'est plus simple de dire que typename est obligatoire dans tous les cas où le nom du type est dépendant d'un paramètre template que d'essayer de se limiter aux cas où il y a une ambiguité. Sans parler de la nécessité qu'il y aurait alors de s'assurer qu'il y a bien une ambiguité.
    Ok cette fois ci j'ai bien compris .
    Dans les cas où il n'y a pas d'ambiguté, cela permet de faciliter le travail du compilateur à s'en rendre compte.


    Merci pour toutes vos réponses.
    J'espère ne pas vous avoir noyé sous le flots de mes questions

  6. #26
    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 MatRem
    Dans les cas où il n'y a pas d'ambiguté, cela permet de faciliter le travail du compilateur à s'en rendre compte.
    Je crois que c'est d'abord le travail de specification et ensuite le travail du programmeur qu'on a chercher a simplifier avant le travail du compilateur.

    Les regles du C++ sont deja assez compliquees comme ca, non?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #27
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Certes c'est un peu compliqué mais c'est une condition de la liberté, et moi j'aime autant.
    Bon par contre c'est vrai que le travail d'une norme c'est de chercher l'efficacité autant pour les programmeurs que pour le compilateur, donc c'est plutôt logique en fait.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/10/2013, 21h57
  2. Réponses: 7
    Dernier message: 05/04/2011, 17h19
  3. Réponses: 21
    Dernier message: 14/01/2010, 12h50
  4. Réponses: 15
    Dernier message: 28/04/2009, 07h26
  5. Réponses: 6
    Dernier message: 30/03/2009, 18h13

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