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 :

Ne détecte pas ma classe alors que l'include est bien fait


Sujet :

C++

  1. #1
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut Ne détecte pas ma classe alors que l'include est bien fait
    Voila, je programme des arbres avec héritage et template.

    La classe "AbstractTree" est héritée par "ListTree" et "VectorTree". ListTree utilise des noeuds, un structure qui contient des pointeur ver les fils (gauche et droit).

    Voici AbstractTree.h :
    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
    #ifndef __ABSTRACT_TREE_HPP
    #define __ABSTRACT_TREE_HPP
     
    #include <iostream>
    #include "Node.h"
    using namespace std;
     
    class AbstractTree
    {
        public:
         virtual void insert(Node) = 0;
         virtual anElement racine() const = 0;
         virtual bool vide() const = 0;
    };
     
    #endif
    Voici Node.h :
    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
    #ifndef __NODE_HPP
    #define __NODE_HPP
     
    #include <iostream>
    using namespace std;
     
    template <class anElement>
    class Node
    {
        private:
         Node* leftSon, rightSon;
         anElement value;
     
        public:
         Node(anElement aValue)         {leftSon=NULL; rightSon=NULL; value = aValue;};
         Node* getLeftSon() const       {return leftSon;};
         Node* getRightSon() const      {return rightSon;};
         void setLeftSon(Node* aNode)   {leftSon = aNode;};
         void setRightSon(Node* aNode)  {rightSon = aNode;};
         anElement getValue() const     {return value;};
    };
     
    #endif
    Voici le ListTree.h :
    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
    #ifndef __LIST_TREE_HPP
    #define __LIST_TREE_HPP
     
    #include <iostream>
    #include "AbstractTree.h"
    using namespace std;
     
     
    class ListTree : public AbstractTree
    {
        public:
         ListTree();
         bool vide() const;
         bool operator==(const Node) const;
         Node racine() const;
         void insert(const Node);
    };
     
    #endif
    Il me dit, lors de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    AbstractTree.h:11: error: `Node' is not a type
    AbstractTree.h:11: error: ISO C++ forbids declaration of `parameter' with no type
    AbstractTree.h:12: error: `anElement' does not name a type
    ListTree.h:14: error: ISO C++ forbids declaration of `Node' with no type
    ListTree.h:15: error: `Node' does not name a type
    ListTree.h:16: error: ISO C++ forbids declaration of `Node' with no type
    :: === Build finished: 6 errors, 0 warnings ===
    J'ai essayé avec un autre compilteur, on ne sait jamais, mais sans résultat...
    Aidez-moi svp ! Merci d'avance !
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Node n'est pas un type ,

    tu en as fait un template donc tu dois faire un truc du type
    Node< xxx>

  3. #3
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Je dois faire ca alors ?

    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
    #ifndef __ABSTRACT_TREE_HPP
    #define __ABSTRACT_TREE_HPP
     
    #include <iostream>
    #include "Node.h"
    using namespace std;
     
    template <class Node>
    class AbstractTree
    {
        public:
         virtual void insert(Node) = 0;
         virtual Node racine() const = 0;
         virtual bool vide() const = 0;
    };
     
    #endif
    Je dois avouer que les template en héritage, j'ai jamais fait ! Donc explique moi bien stp .

    Le template enElement est dans noeud qui est une classe, je dois mettre Node en template aussi alors ?

    Si je met "template <class Node>", Node gardera le comportement de ma classe Node ?


    Je ne comprend pas très bien non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListTree.h:10: error: expected class-name before '{' token
    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class ListTree : public AbstractTree
    {   <------------- ici !
        public:
         ListTree();
    C'est pourtant comme ca que j'ai fait au paravant !
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class AbstractTree
    {
        public:
         virtual void insert(Node) = 0;
         virtual anElement racine() const = 0;
         virtual bool vide() const = 0;
    };

    Node est un template, alors il faut que tu passes ta classe AbstractTree en template comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <class anElement>
    class AbstractTree
    {
        public:
         virtual void insert(Node<anElement> ) = 0;
         virtual anElement racine() const = 0;
         virtual bool vide() const = 0;
    };
    Juste au passage : lorsque tu fais des #ifndef #define, ne met pas deux underscore, c'est plutôt réservé aux bibliothèques systèmes.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    De plus, on ne met pas de using namespace dans un fichier d'en-tête.
    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.

  6. #6
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    MErco pour l'explication du Node<anElement> !!! Ca fonctionne Je n'ai pas l'habitude des template :s.

    Pour le using name space, tu as tout a fait raison, je l'avai mi pour essayer, mais j'ai ouiblier de le retirer ! Merci pour vos remarque !!!

    J'ai toujour un petit pbl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <class anElement>
    class ListTree : public AbstractTree
    { <------------(*)
        public:
         ListTree();
         bool vide() const;
         bool operator==(const ListTree) const;
         anElement racine() const;
         void insert(const anElement);
    };
    Il me dit à cet endroit (*) :
    :: === myTree, Debug ===
    ListTree.h:10: error: expected class-name before '{' token
    :: === Build finished: 1 errors, 0 warnings ===
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  7. #7
    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
    Abstract Tree est aussi template alors donne-lui les paramètres.

  8. #8
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Merci, tout va bien maintenant !
    JE vous adore

    A bientôt
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/11/2014, 16h23
  2. Réponses: 1
    Dernier message: 29/09/2011, 11h31
  3. Réponses: 22
    Dernier message: 29/04/2011, 15h23
  4. Réponses: 0
    Dernier message: 28/07/2010, 16h52
  5. MySQL ne renvoie pas d'erreur alors que la chaine est fausse
    Par repié dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/11/2007, 12h18

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