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 :

Type non reconnu (use of undefined type)


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut Type non reconnu (use of undefined type)
    Bonjour,

    j'ai le probleme suivant:

    Un fichier Object.h contient la definition d'une classe Object qui contient un typedef enum, un peu comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace Test{
     
    class Object{
     
    public:
    typedef enum{...}Object::MyEnum;
    ...
    }
    }
    Ensuite j'ai un autre fichier Base.h qui contient une autre classe et qui contient des fonctions ayant en parametre cet enum, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #include "Object.h"
    namespace Test{
     
    class BaseClass{
     
    public:
     
    void MyFonction(Object::MyEnum my_enum,...);
    J'obtient le message d'erreur suivant a la compilation:

    "Base.h: error C2027: use of undefined type 'Test::Object'"

    Je comprends pas pourquoi il reconnait pas la classe definit dans Object.h

    Merci d'avance !!!


    EDIT:
    je viens de me rendre compte que j'avais 2 "{" dans mon enum, donc en reglant ce probleme, le message est toujours su la meme ligne, mais c'est le suivant:

    'Object' : is not a class or a namespace name

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Object:: n'est pas en trop ligne 7 ?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par micamused Voir le message
    Je comprends pas pourquoi il reconnait pas la classe definit dans Object.h
    Parce que la recherche se fait par en relatif par rapport à Test::BaseClass.
    Tu dois donc désigner le "chemin" complet, et le faire précéder par ::.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Déjà, il faut savoir que la définition de type en C++, qu'il s'agisse de classe, de structure, d'énumération ou d'union, vaut déclaration du type en question.

    Autrement dit, dés que le compilateur rencontre un mot clé parmi class, enum, struct ou union, il sait qu'il existe le type correspondant au nom qui suit.

    Il n'est dés lors plus utile de créer un typedef sur le type en question (sauf cas particuliers )

    ainsi, ton énumération serait beaucoup plus juste sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Object
    {
       enum MyEnum{/* ... */};
    };
    Ensuite, il faut savoir que, si tu te retrouves, comme dans le code que tu présentes, avec quelque chose prenant la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Object{
     
    public:
    typedef enum{...}Object::MyEnum;
    ...
    }
    le typedef essaye de définir un nouveau nom de type dans un type nommé Object qui est sensé se trouver dans... Object.
    autrement dit, le compilateur s'attendrait à trouver quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Object
    {
        class Object
        {
        /* ... */
        }; 
        /* ... */
    };
    afin de définir MyEnum dans... Object::Object

    La bonne manière de créer ton énumération est donc de le faire sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Object{
     
    public:
    enum MyEnum{...};
    ...
    }
    ce qui créera une énumération accessible sous la forme de Object::MyEnum

    Ceci dit, je ne saurais trop te conseiller de lire cette discussion, qui débat de l'idée du "super object", car je t'avouerai que c'est une idée qui ne me plait pas particulièrement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    J'avais essaye ca mais j'avais egalement une erreur, du coup j'ai change la definition du parametre de ma fonction par un unsigned int au lieu du type de l'enum et ca compile nickel.

    Est-ce correct de faire ca ou y-a-t-il un risque??

    Le type des elements d'un enum est unsigned int, non??

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Le risque, c'est d'avoir un argument qui n'est pas un enum.
    Donc, tu devras inclure un controle de valeur dans ta fonction.

    Certes, un enum est représenté par un type entier.
    Mais quel est l'enum nommé 65535? aucun, alors que c'est bien un unsigned int.

    Si tu le peux, utilise les class enum de C++11, cela renforcera le code, en empechant la conversion avec les entiers.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2010, 00h24
  2. Réponses: 2
    Dernier message: 16/08/2009, 13h20
  3. Réponses: 6
    Dernier message: 24/07/2009, 14h44
  4. error:invalid use of undefined type
    Par assif dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 21h11
  5. definition de type non reconnu par g++ ou erreur?
    Par harsh dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 09/06/2006, 01h42

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