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 :

Les namespace sont nos amis....


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut Les namespace sont nos amis....
    Enfin ils devraient...


    Je viens d'intégrer dans un projet Ogre3D une librairie de physique a moi. Problème : des classes ont des noms identiques dans Ogre et dans ma librairie...

    Donc hop je me dis super les namespaces vont me sauver la vie!

    Oui sauf que... ca ne marche toujours pas...


    Comment expliquer ca...


    Alors en simplifiant un peu, le fichier Quat.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
    24
    25
    26
    #include "Vector3.h"
     
    namespace Physix{
     
    class Quat {
    public:
    	double	n;	// partie reelle
    	Vector3	v;	// vecteur imaginaire
     
    	inline Quat(void);
    	inline Quat(double ne, double v1, double v2, double v3);
     
    	inline double norme(void) const;
    };
     
     
    inline	Quat operator+(Quat q1, Quat q2);
     
     
    std::ostream &operator<<(std::ostream &sortie, Quat &v);
     
     
    }//Physix
     
     
    #include "../Code/Quat.inl"
    Et le fichier Quat.inl, inclu a la fin de Quat.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
     
    namespace Physix{
     
    inline Quat::Quat(void){
    	n = 0;
    	v.x = 0;
    	v.y = 0;
    	v.z = 0;
    }
     
    inline bool Quat::isUnit() const{
    	return ((n*n + sqrt(v.norme())) >= 1-Constantes::tolerance) ;
    }
     
    } //Physix
    Résultat : au niveau de la methode Physix::Quat::isUnit(), erreur de compil : error C2039: 'norme' : is not a member of 'Ogre::Vector3'

    Mon v qui devrait etre un Physix::Vector3 est toujours concidéré comme un Ogre::Vector3

    Que faire??? Et en plus ca ne déconne que la car il n'y a pas de methode equivalente dans le Vector3 de Ogre, mais je ne suis du coup meme plus sur que ce sont bien mes fonctions qui seront utilisées


    Merci pour vos lumières sur les namespaces, je ne vois pas ce qui m'échappe la...

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Est-tu certain de ne pas avoir de using namespace dans un .h quelconque ?
    Tu ne nous l'a pas montré, mais je suppose que Vector3 est lui aussi défini dans le namespace Physix ? Et que dans Ogre3D, il est défini dans un namespace idoine ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Vector3 est créé selon exactement le meme schema en effet.


    Par contre j'ai en effet dans les .h concernant mon application des using namespace Ogre;
    Cela pose probleme meme quand je suis en train de déclarer une methode en plein milieu de mon autre namespace physix??

    Quelle est la portée d'un using namespace? Je suis obligé de tous les enlever et de tout nommer les namespace en préfixe a la force du poignet? :p

  4. #4
    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
    Par contre j'ai en effet dans les .h concernant mon application des using namespace Ogre;
    Ben vire les.

  5. #5
    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
    Tes inlines ne servent à rien, ils sont simplement virés par le compilateur. Donc tu vas aussi avoir des problèmes d'édition des liens. Si tu veux inliner de force, définis directement dans la déclaration de la classe, ça sert à ça

    Ta fonction norme est appelée sur un Vector3 alors qu'elle est définie pour Quat, c'est normal ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Par contre j'ai en effet dans les .h concernant mon application des using namespace Ogre;
    Je crois que c'est une mauvaise idée que de mettre des using namespace dans un fichier d'en-tête. Il faut penser que ton en-tête est susceptible d'être inclu dans une foule de fichiers .cpp. Mettre un using dans ce .h revient donc à le mettre dans tous les .cpp qui incluent le .h ! Imagine la pollution et les effets bizarres !
    Il faut que tes fichiers d'en-têtes soient les plus "universels" possibles. Je te conseille d'utiliser le nommage complet dans les .h "MonNamespace::MaClasse" et dans les .cpp d'ajouter un "using MonNamespace" APRES toutes les directives #include pour que ces using ne s'appliquent pas au .h inclus.

    C'est certes un peu lourd de se fader les namespaces complets dans les .h mais c'est le seul moyen à mes yeux de s'en sortir.

    Bon courage !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Miles
    Tes inlines ne servent à rien, ils sont simplement virés par le compilateur. Donc tu vas aussi avoir des problèmes d'édition des liens. Si tu veux inliner de force, définis directement dans la déclaration de la classe, ça sert à ça

    Ta fonction norme est appelée sur un Vector3 alors qu'elle est définie pour Quat, c'est normal ?
    Je ne savais plus si c'était dans le prototype ou dans la déclaration qu'il fallait le inline alors j'ai mi aux deux endroits ca ne pose pas de problemes Dans le prototype ca suffit donc?

    Sinon oui, un Quat a une norme et un Vector3 en a une aussi.




    Bon je vais essayer de virer les using (ces .h ne sont pas de moi )

  8. #8
    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
    Tous les mots clés inline sont à jeter. L'inline ne fonctionne pas comme ça. Si tu veux vraiment forcer l'inline, il te faut définir ta fonction dans la déclaration de la classe et pas à côté dans un fichier .inl.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Franchement je n'y comprends rien...


    Ca fait une journée que je me prends la tête a essayer toutes les solutions possibles pour corriger un pauvre probleme de noms de classes identiques, et rien n'y fait...

    J'ai beau avoir viré les using, j'ai toujours des erreurs incomprehensibles

    Par exemple pour les corps des methodes de Quat j'ai des
    error C2039: 'v' : is not a member of 'Physix::Quat'

    Alors que Vector3 v; est bien dans ma classe Quat...


    Bref je ne comprends rien a ce qui se passe la je commence a désespérer

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Ouais, là faudrait voir un bout de code pour comprendre. Tu peux mettre en ligne un .cpp qui pose problème avec les .h qui vont avec ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7

  12. #12
    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
    J'ai pas pu voir ton code, mais ça en serait pas étonnant que l'inclusion de ton fichier .h déclarant Quat plante.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Mais pourquoi planterait-elle la coquine? :p

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 47
    Points : 47
    Points
    47
    Par défaut
    T'aurais pas un forward qui traine au mauvais endroit ?
    hors d'un namespace alors qu'il faudrait qu'il soit dedans ou inversement ?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    C'est quoidonc un forward?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 47
    Points : 47
    Points
    47
    Par défaut
    forward déclaration :

    qd dans un fichier header tu as un pointeur sur une classe "toto", une référence sur une classe "toto", ou même une classe "toto" en paramètre d'un template, tu peux (et c'est souvent conseillé) dans le .h déclarer un forward déclaration au lieu d'un include :

    class toto; (au lieu de : #include "toto.h")

    par contre, l'include se fait dans le cpp dans ce cas.

    Il arrive qu'un malencontreux forward provoque des "classe déjà existante".
    Ou même des plantages à l'execution dans des cas particuliers avec des compilos permissifs...

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    Non pas de ca, en tout cas pas dans les classes ou ca déconne a plein tube (le fait d'utiliser des déclaration inline m'empeche de procéder comme ca de toute facon)




    edit:
    En fait le gros problème c'est que dans ma classe Quat le compilo semble ignorer mon Vector3 :/

    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
     
    #ifndef __Quat_H__
    #define __Quat_H__
     
    #include "Vector3.h"
     
    namespace Physix{
     
    class Quat{
    public:
    	double	n;	// partie reelle
    	Vector3	v;	// vecteur imaginaire
     
    	inline Quat();
    	inline Quat(double ne, double v1, double v2, double v3);
    	inline Quat(double ne, Vector3 v1);
    ...
    };
     
     
    inline Quat operator+(Quat q1, Quat q2);
    ...
     
    std::ostream &operator<<(std::ostream &sortie, Quat &v);
    ...
     
    #include "../Code/Quat.inl"
     
    }//Physix
    #endif //__Quat_H__

    Et j'inclu bien en haut ma classe Vector3 pourtant...

    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
    33
    34
     
    #ifndef __Vector3_H__
    #define __Vector3_H__
     
    #include <iostream>
     
    namespace Physix{
    //Classe de vecteurs à 3 composantes
    class Vector3{
    private:
     
    public:
    	double x,y,z;
     
    	//Constructeurs
    	inline Vector3();
    	inline Vector3(double x, double y, double z);
     
    ...
     
    };
     
    inline	Vector3 operator+(Vector3 u, Vector3 v);
    ...
     
    std::ostream &operator<<(std::ostream &sortie, Vector3 &v);
     
     
     
    #include "../Code/Vector3.inl"
     
    }//Physix
     
    #endif // __Vector3_H__

    Ce qui donne
    Quat.h(11) : error C2146: syntax error : missing ';' before identifier 'v'
    A la ligne ou je déclare v comme un Vector3 dans la classe Quat...


    A n'y rien comprendre...

Discussions similaires

  1. Timezone chez nos amis les québécois
    Par Mr Belette dans le forum Langage
    Réponses: 6
    Dernier message: 12/03/2012, 11h25
  2. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  3. Réponses: 2
    Dernier message: 01/09/2009, 10h26
  4. Nos amis les joins
    Par crashtib dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/05/2009, 23h11

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