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 :

Template et classe "amie" ?


Sujet :

Langage C++

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Template et classe "amie" ?
    Bonjour,

    J'essaie de mettre au point une classe de liste chainée générique,
    mais ma connaissance des template est trés limitée.

    Mon pb est le suivant:
    La classe CElement doit déclarer 'amie' la classe CList pour que
    celle-ci puisse la manipuler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    template <typename T>
    class CElement
    {
       friend class CList<T>; 
       ...
       private :
           T data; 
           CElement<T> *next;  
    };
     
     
    template <typename T>
    class CList
    {
      CElement<T> *head; 
      CElement<T> *tail; 
     
         public:
            ....
    }
    et là le compilateur me dit: error: CList is not a template

    Quelqu'un pourrait-il m'aider ?

    Merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Indique avant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T>
    class CList;

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Merci pour ta réponse mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <typename T>
    class CList;
    j'ai 37 erreurs en cascade

    Peut être le pb vient-il des typename identique (T) dans
    les 2 classes ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ah bon ??? Tu peux donner les premières erreurs ?

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Aprés quelques rectification dans mes fonctions membres il n'y a plus que 22 erreurs, on progresse

    Toutes les erreurs sont dû à la surcharge de l'opérateur d'affectation qui
    est déclaré comme ça dans la classe CLIst:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList operator = (const CList &);
    puis définit comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    CList<T> CList<T>::operator = (const CList & source) 
    {  
        if (this != &source) 
        {                    
           empty();
     
           CElement *copy = source.head;
     
           while (copy != NULL)
           {
               if(addEnd(copy->data))
               {
                 copy = copy->next;
               }
                else
                {
                  copy = NULL;
                }
           }
        }
     
        return *this;  //On retourne une référence sur l'objet courant
    }
    les 1ere erreurs sont:

    - T was not declared in this scope
    - template argument l is invalid

    ces 2 erreurs concernent la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<T> CList<T>::operator = (const CList & source)
    Si tu as une idée...

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est normal l'espace entre operator et = ?

  7. #7
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Je ne sais pas, mais je l'ai souvent vu écrit comme ça.
    Je ne pense pas que l'erreur vienne de là.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Tu as répété template<typename T> juste avant la définition de la fonction ?

    Il me semble que c'est nécessaire pour les définitions hors-classe de fonctions template...

  9. #9
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Exacte!
    Maintenant ça compile sans erreurs.

    Le pb maintenant c'est lorsque j'instancie un objet ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<int> maListe;//créé une liste chainée de int
    quand je veux lancer l'appli, l'IDE (CodeBlock) me dit que le projet
    n'a pas encore été "builder". J'ai beau le builder et le rebuilder, dès
    que je veux lancer l'appli le même message revient.

    Est ce mon instantiacion qui est fausse ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Ca ressemble plus à un problème de ton EDI, parce que ça n'a aucun rapport...

    (à moins que tu n'aies des erreurs de compilation ou d'édition de liens, je ne sais pas trop comment C::B les signale...)

  11. #11
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Apparement la syntaxe exacte pour instancier un objet ce serait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<int> maListe();//créé une liste chainée de int
    là, tout compile et le prog se lance.

    Maintenant est ce que quelqu'un pourrait me dire la syntaxe exacte pour se servir d'une fonction membre ?

    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maListe.fonction(45);
    mais ça ne marche pas.
    Et ça non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maListe.fonction<int>(45);
    Merci d'avance

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ca devrait marcher, pour la première solution:
    C'est quoi l'erreur?
    Ta fonction est bien publique, avec le bon nombre de paramètres, et le bon type?

    EDIT : Montre nous ton code de ta classe... j'avais oublié que t'as des template...

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CList<int> maListe();//créé une liste chainée de int
    C'est un prototype de fontion qui prend rien en argument et qui renvoie une CList<int>.
    Il y a donc un problème soit dans ton constructeur, soit dans ton destructeur.

  14. #14
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par tintin72
    Apparement la syntaxe exacte pour instancier un objet ce serait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CList<int> maListe();//créé une liste chainée de int
    Non, non, je ne crois pas. Là tu définis plutôt une fonction...

    Voir http://c.developpez.com/faq/cpp/?pag..._list_list_fct

  15. #15
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Montre nous ton code de ta classe... j'avais oublié que t'as des template...
    Déclaration des constructeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    template <typename T>
    class CList
    {
      CElement<T> *head; //pointeur sur le 1er élément
      CElement<T> *tail; //pointeur sur le dernier élément
      CElement<T> *curr; //pointeur sur l'élément courant.
      UINT nbElem;  //nombre d'éléments dans la liste
     
         public:
     
      CList();   //Constructeur par défaut
      CList(const CList &);  //Constructeur par copie
     
      ~CList() {empty();}  //Destructeur
     
      méthodes etc ...
    }
    définition des 2 constructeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    template <typename T>
    CList<T>::CList() //constructeur par défaut
    {
       head = NULL; 
       tail = NULL;
       curr = NULL;
       nbElem = 0;
    }
     
     
    template <typename T>
    CList<T>::CList(const CList<T> & source) //constructeur de copie
    {
       head = NULL;
       tail = NULL;
       curr = NULL;
       nbElem = 0;
     
        CElement<T> *copy = source.head;                                    
        while(copy != NULL)
        {
           if(addEnd(copy->data))
           {
             copy = copy->next;
           }
            else
            {
              copy = NULL;
            }
        }
    }
    Les fonctions membres utilisées par le destructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    template <typename T>
    void CList<T>::empty() //efface tous les éléments de la liste
    {
       while (nbElem > 0)   removeBeg();
    }
     
    template <typename T>
    void CList<T>::removeBeg()
    {
        if (nbElem > 0) //s'assure que la liste n'est pas vide
        {
           if (nbElem == 1) //s'il n'y a qu'un seul élément dans la file
           {
              delete head; //on l'efface
              tail = head = curr = NULL; //on remet tous les pointeurs à NULL.
              nbElem--; //et on décrémente le nombre d'éléments présent dans la liste
              return;
            }
     
           CElement<T> *delElem = head;
           if(curr == head) curr = head->next; //si l'élément courant est la tête
           head = head->next;
           head->prev = NULL;
           delete delElem;  //On efface l'élément.
     
           nbElem--; //décrémente le nombre d'éléments présent dans la liste
        }
    }

  16. #16
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu ferais mieux d'utiliser les classes imbriquées...

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu veux dire mettre la déclaration des fonctions dans la définition de la classe ? Je suis aussi d'accord.

    Bon, l'erreur est où ? C::B doit bien retourner une erreur d'édition des liens ? - d'ailleurs, ton code template est où par rapport à son utilisation ?

  18. #18
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Pardon....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    undefined reference to `CList<int>::CList()'
    undefined reference to `CList<int>::empty()'

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On en revient donc toujours au même problème :
    http://c.developpez.com/faq/cpp/?pag...VERS_templates

  20. #20
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    ça marche
    On en revient donc toujours au même problème :
    http://c.developpez.com/faq/cpp/?pag...VERS_templates
    Désolé, je suis pourtant allé sur la FAQ, mais je n'ai pas suffisament de connaissances dans les templates pour repérer le pb.
    Mais ça va changer à force de venir sur ce forum

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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