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 :

problème de namespace


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut problème de namespace
    Salut à tous

    J'ai un problème de namespace entre mes classes, tout fonctionnait bien puis j'ai mis un namespace sur l'une d'elles, et maintenant gcc ne reconnaît plus les autres classes quand je suis dedans, et quand je suis dans les autres classes il ne reconnaît plus la classe du namespace. Je pensais qu'il fallait mettre using namespace xxx dans les .h des classes, comme pour utiliser std, mais ça ne fonctionne pas :s

    Avez-vous une idée ?

    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
    //Controller_observation.h
    //classe sur laquelle je veux mettre le namespace controller_observation
    //le namespace lofar provient d'un framework que j'utilise
    using namespace std;
    namespace LOFAR {
     
    namespace CONTROLLER_OBSERVATION {
     
    class ControllerObservation : public GCFTask
    {
    public:
        ControllerObservation();
        virtual ~ControllerObservation();
     
        GCFEvent::TResult initial(GCFEvent& e, GCFPortInterface& p);
     
    protected:
        Instrument	 *m_instrument; //ne compile plus
        GCFTimerPort *m_watchDog;
     
    }; // end class
    }; //end namespace Controller_Observation
    }; //end namespace lofar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "controllerObservation.h"
    using namespace CONTROLLER_OBSERVATION;
     
    ControllerObservation::ControllerObservation() : GCFTask((State) & ControllerObservation::initial, "ControllerObservation") {
    	m_instrument = NULL;
    	m_watchDog = NULL;
    }
     
    // [...]
    jusque la ça va, mais c'est avec l'une de mes autres classes la que ça rate:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using namespace std;
    using namespace CONTROLLER_OBSERVATION; //m'affiche une erreur
     
    class Instrument {
    public:
    	Instrument();
    	virtual ~Instrument();
    protected:
        int m_temps_scrutation;
    };
     
    #endif /* INSTRUMENT_H_ */
    Qu'est-ce qui ne va pas à votre avis ?

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par scheme Voir le message
    Salut à tous

    ...
    Qu'est-ce qui ne va pas à votre avis ?
    je pense que tu as oublié d'indiquer que CONTROLLER_OBSERVATION est dans le namespace LOFAR.

    cf ce petit exemple:
    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
    #include <iostream>
    namespace first {
      int x;
      namespace second {
        int y;
      }
    }
    int main() {
     
      first::x = 12;
      first::second::y = 27;
      std::cout << "x= " << first::x <<  ", y=" << first::second::y << std::endl;
     
      using namespace first::second;
     
      std::cout << "x= " << first::x <<  ", y=" << y << std::endl;
      return 0;
    }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Merci c'est sympa de m'avoir répondu aussi rapidement

    Tant que j'y suis j'ai un autre problème, dans la classe Controller_Observation j'ai défini un typedef:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned short uint16;
    Je me place dans le même namespace dans ma classe Instrument, en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace LOFAR {
        namespace CONTROLLER_OBSERVATION {
    car namespace LOFAR::CONTROLLER_OBSERVATION ne passe pas, ni using namespace LOFAR::CONTROLLER_OBSERVATION

    Mais dans ma classe Instrument je n'arrive pas à réutiliser le typedef, apparemment il ne voit pas ce que j'ai défini avant

    En gros ça donne ç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
    //Controller_observation.h
    namespace LOFAR {
    namespace CONTROLLER_OBSERVATION {
     
    typedef unsigned short uint16;
     
    class ControllerObservation : public GCFTask
    {
    public:
        ControllerObservation();
        virtual ~ControllerObservation();
     
    };
     
    };
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Intrument.h
    namespace LOFAR {
    namespace CONTROLLER_OBSERVATION {
     
    class Instrument {
    public:
    	Instrument();
    	virtual ~Instrument();
    protected:
            uint16 test; //ne compile pas !
    };
    };
    };
    Je ne comprend pas pourquoi je ne peux pas le réutiliser tel quel

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Attention

    LOFAR::CONTROLLER_OBSERVATION
    et CONTROLLER_OBSERVATION sont deux namespace distinct.
    Dans ton bout de code je pense qu'il manque un namespace LOFAR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Intrument.h
    namespace LOFAR {
      namespace CONTROLLER_OBSERVATION {
     
      class Instrument {
         public:
    	Instrument();
    	virtual ~Instrument();
         protected:
            uint16 test; //ne compile pas !
       };
      };
    };
    Cf ce petit exemple:
    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
    #include <iostream>
    namespace first {
      int x;
      namespace second {
        int y;
      }
    }
    namespace second {
      int y;
    }
    int main() {
      first::x = 12;
      first::second::y = 27;
      second::y = 32;
     
      std::cout << "x= "    << first::x 
                <<  ", y="  << first::second::y 
                << " or y=" << second::y << std::endl;
     
      {
        using namespace first::second;
        std::cout << "x= " << first::x 
                  <<  ", y=" << y << std::endl;
      }
      {
        using namespace second;
        std::cout << "x= " << first::x 
                  <<  ", y=" << y  << std::endl;   
      }
      return 0;
    }
    g++ namespace.cpp -o namespace && ./namespace
    x= 12, y=27 or y=32
    x= 12, y=27
    x= 12, y=32

    Compilation finished at Mon Oct 4 17:37:59
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Je me suis trompé dans la quote de mon code, j'ai bien mis namespace LOFAR { avant, mais je n'arrive pas à utilliser le typedef

    Merci de m'apporter ton aide

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Je n'ai pas ton problème d'utilisation de typedef avec ce code:
    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
    #include <iostream>
    namespace first {
      namespace second {
        typedef unsigned short uint16;
      }
    }
    namespace first {
      namespace second {
        class TestClass {
        public:
          TestClass() {}
          virtual ~TestClass() {}
          uint16 x16;
        };
      }
    }
    int main() {
     
      using namespace first::second;
      TestClass tc;
      tc.x16 = 12;
      std::cout  << "tc.x16 = " << tc.x16 << std::endl;  
      return 0;
    }
    Peu tu indiquer le message d'erreur de ton compilateur?
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Le compilateur me dit que uint16 n'est pas défini

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    peux tu faire un copier coller du message de la log de compilation (au moins la partie faisant référence à l'erreur)


    Quel compilateur utilise-tu, quelle version, sous quel environnement?
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Apparemment ce typedef est déjà défini dans le framework, du coup j'ai fais un include du fichier et là je peux l'utiliser.

    Je ne comprend toujours pas pourquoi ce typedef n'est pas passé avant que je fasse l'include, mais au moins ça marche alors je mets en résolu.

    Merci de m'avoir apporté tes lumières

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

Discussions similaires

  1. [XSLT]Problème de namespace sur un export XMi (UML 2.1/XMi 2.1)
    Par CocoRambo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/06/2007, 09h50
  2. problème de namespace
    Par deubelte dans le forum C++
    Réponses: 10
    Dernier message: 30/05/2007, 12h48
  3. [C#/.NET 2.0] Problème de namespace/référence
    Par Tetram165 dans le forum Services Web
    Réponses: 2
    Dernier message: 05/01/2007, 01h55
  4. [XSD] Problème de namespace
    Par pierrelm dans le forum Valider
    Réponses: 3
    Dernier message: 14/09/2006, 01h19
  5. [DOM] Problème de namespace
    Par dauggui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/04/2006, 07h22

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