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 :

STL et classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut STL et classe template
    Bonjour,
    Pouvez vous m'expliquer pourquoi le code suivant ne compile pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <list>
     
    template<class T>
    struct A {
        T t;
    };
     
    template<class T>
    struct B {
        std::list<A<T> >::iterator i;
    };
    Ce n'est probablement pas une question nouvelle, mais je n'ai aucune idée de quelle recherche faire. Ce serait une seconde question.

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Je n'ai pas testé, mais ceci devrait compiler:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <list>
     
    template<class T>
    struct A {
        T t;
    };
     
    template<class T>
    struct B {
        typename std::list<A<T> >::iterator i;
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename std::list<A<T> >::iterator i;

    Sinon le compilo ne sait pas que A est un type .

    edit : grilled... et puis bien :p

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Hmm, A est pourtant défini juste au dessus.
    Qu'est ce cela pose comme problème au compilateur ?

    Si c'est A qui pose problème, pourquoi ceci marche-t-il ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class T>
    struct B {
        std::list<A<int> >::iterator i;
    };

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    C'est la norme :
    A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the nam is qualified by the keyword typename
    Dans ton dernier exemple, tu n'utilises pas ton paramètre template pour instancier ton itérateur de liste.

    P.S.: j'ai toujours des craintes quand je vois un iterateur membre d'une classe. Es-tu sûr de ta conception ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    std::list<T>::iterator peut être un type mais std::list<U>::iterator peut être une variable.
    Les instanciations de templates sont totalement indépendantes car spécialisables.

    C'est pour ça qu'il faut mettre typename.

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    C'est la norme :
    [...]la norme[...]
    Dans ton dernier exemple, tu n'utilises pas ton paramètre template pour instancier ton itérateur de liste.

    P.S.: j'ai toujours des craintes quand je vois un iterateur membre d'une classe. Es-tu sûr de ta conception ?
    Merci pour la citation.

    Et pas d'inquiétude, j'utilise bien l'itérateur dans une boucle, c'était juste pour donner un exemple minimal.

    Citation Envoyé par loufoque Voir le message
    [...]std::list<U>::iterator peut être une variable.[...]
    Toujours pas très clair. "iterator" pourrait être le nom d'une variable de std::list<U>, qui cacherait le type défini dans std::list<> ?

Discussions similaires

  1. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36
  2. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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