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 :

[Template] Différentes syntaxes


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut [Template] Différentes syntaxes
    Bonjour,

    J'ai un manuel C++ dans lequel il est indiqué que la déclaration des classes templates se code ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template < class T >
    class A
    {
      // définition de la classe A paramétrée par T
    };

    et de même pour mes fonctions template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template < class T >
    // définition de la fonction paramétrée par T
    Or dans d'autres sources (la FAQ entre autres) j'ai pu voir que le mot clef class était remplacé par 'typename'. Quelle est donc la différence ?

    Ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template < class T >
    class A
    {
      // définition de la classe A paramétrée par T
    };
    est-il équivalent à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template < typename T >
    class A
    {
      // définition de la classe A paramétrée par T
    };

    merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Tu peux employer les deux termes indifféremment dans la plupart des cas.
    La seule situation dans laquelle on n'a pas le choix, c'est lorsque qu'une classe ou une fonction a un paramètre template template. Dans ce cas seul l'emploi du mot clé class est autorisé.

    Par exemple, cette définition de la classe A est correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, template<typename> class C>
    class A
    {
    };
    alors que celle-ci ne l'est pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, template<typename> typename C>
    class A
    {
    };

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En plus de ce qu'a dit Montag, je rajouterais que utiliser typename ou class peut influencer lors de la lecture de ton code que ce soit par toi-même plus tard ou par d'autres personnes... Je m'explique.
    class dénote plutôt ... une class, donc ça a plus tendance à signifier que tu attends des classes/structures comme paramètres.
    typename dénote quand à lui plus ou moins n'importe quel type, notamment les types fondamentaux (int, char & compagnie).

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    C'est clair.

    Je vous remercie

  5. #5
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Historiquement, le mot clef typename n'existait pas et le mot clef class était "recyclé", dans une déclaration de template, pour déclarer un paramètre. Une économie mal venue laissant suggérer que le type exact utilisé pour le paramètre devait être celui d'une classe et non d'un type primitif. En plus de ça, les premières versions du C++ sur les templates n'acceptaient pas la déclaration de type utilisant un template (p. ex. Type::InnerType où Type est un template). Le comité a voulu faire d'une pierre deux coups en introduisant typename pour faire comprendre aux gens qu'un type template n'est pas forcément une classe et permettre les notations telles Type::innerType, mais uniquement via ce nouveau mot clef. De fait, l'ancienne notation ne sert plus à rien, si ce n'est pour préserver la compatibilité.

    Citation Envoyé par Montag Voir le message
    Salut,

    Tu peux employer les deux termes indifféremment dans la plupart des cas.
    La seule situation dans laquelle on n'a pas le choix, c'est lorsque qu'une classe ou une fonction a un paramètre template template. Dans ce cas seul l'emploi du mot clé class est autorisé.

    Par exemple, cette définition de la classe A est correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, template<typename> class C>
    class A
    {
    };
    alors que celle-ci ne l'est pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T, template<typename> typename C>
    class A
    {
    };
    Sauf que dans ce dernier cas, le deuxième typename n'introduit pas le type du template et il s'agit de la même erreur de syntaxe que dans l'extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    typename B // <-- Erreur de syntaxe
    {
    };
    Un autre effet pervers d'avoir voulu réutiliser un même mot clef avec 2 sens différents.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Questions à propos des différentes syntaxes de JSP
    Par tweetysat dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 08/02/2012, 20h11
  2. Différentes syntaxes SQL + Questions
    Par MICHEL_R dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2008, 14h28
  3. Réponses: 2
    Dernier message: 21/09/2007, 15h40
  4. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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