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 :

using namespace automatique ?


Sujet :

C++

  1. #1
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut using namespace automatique ?
    Bonjour,

    J'ai quelques problèmes avec l'application C++ que je développe. Je dois intégrer à mon application déjà existante un package appelé "nauty". Le problème est ici que ce package défini un type "set". Il vient alors un conflit entre ce type et le type "set" défini par la stl. Cela ne poserait aucun problème normalement, puisque le type set de la stl est déclaré dans le namespace std, il suffirait donc d'éviter de mettre "using namespace std;" pour éviter les conflits. Le problème ici, c'est que les fonctions du namespace std ont l'air d'être automatiquement déclarées dans le namespace global (c'est à dire que je peux utiliser les fonctions cin out cout par exemple, sans passer par std::cin ou std::cout, et le tout sans faire de "using namespace std;"). Avez-vous une idée d'où le problème peut venir. Est-ce que dans la dernière version du compilateur g++ le namespace std est dans le namespace global. Si oui, comment puis-je régler ces problèmes de conflit ? Pour info, je poste les différents include que j'utilise :

    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
    35
    36
    37
    38
    39
    40
     
    #include <arpack++/arlssym.h>
     
    #include "CImg.h"
     
    #include <nauty.h>
     
    #include <cstdlib>
     
    #include <iostream>
     
    #include <vector>
     
    #include <set>
     
    #include <stack>
     
    #include <queue>
     
    #include <map>
     
    #include <cmath>
     
    #include <fstream>
     
    #include <ctime>
     
    #include <algorithm>
     
    #include <armadillo>
     
    #include <string>
     
    #include <sstream>
     
     
     
    using namespace cimg_library;
     
    using namespace arma;
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  2. #2
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    il ne trainerait pas un using namespace std; dans un de tes fichiers d'entête par hasard?

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Le problème ici, c'est que les fonctions du namespace std ont l'air d'être automatiquement déclarées dans le namespace global (c'est à dire que je peux utiliser les fonctions cin out cout par exemple, sans passer par std::cin ou std::cout, et le tout sans faire de "using namespace std;"). Avez-vous une idée d'où le problème peut venir.
    Le problème vient très probablement du fait qu'un zigoto à écrit quelque part un "using namespace std" dans un .h,

    La directive using namespace doit être banni des headers car sinon elle se propage par inclusion et pollue le namespace globale comme tu viens d'en faire la douloureuse expérience.

    (D'ailleurs Rayndell, tu tombes dans le même travers avec ton "using namespace cimg_library;" et "using namespace arma;" en plein dans un .h.
    La directive va se propager et une personne qui voudra reprendre ton code risque d'avoir des conflits assez incompréhensible s'il a le malheur de déclarer un type qui existe déjà dans arma ou cimg.)

    Une petite remarque :
    Ecrire "cimg_library::" devant chaque type de la biblio cimg serait quand même un peu pénible, en revanche on peut aussi déclare un alias de namespace comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    namespace cimg = cimg_library;
    Si oui, comment puis-je régler ces problèmes de conflit ?
    1) Le plus simple serait de trouver et de supprimer le "using namesapce std" fautif.
    2) Mais si ce using namespace std est dans du code non modifiable... euu t'es mal . Il faudra alors probablement modifier le code qui déclare le type set rentrant en conflit avec std::set et le mettre dans un namespace.

  4. #4
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Non, c'est la première chose que j'ai vérifiée.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  5. #5
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Je retire ce que j'ai dit, je viens de le trouver.

    Merci de votre aide et désolé du dérangement.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

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

Discussions similaires

  1. using namespace std;
    Par elekis dans le forum SL & STL
    Réponses: 27
    Dernier message: 26/03/2006, 23h01
  2. using namespace std Vs std::
    Par BigNic dans le forum SL & STL
    Réponses: 12
    Dernier message: 24/01/2006, 15h26
  3. probleme avec : using namespace
    Par firejocker dans le forum C++
    Réponses: 3
    Dernier message: 28/11/2005, 12h15
  4. using namespace std...
    Par miminou dans le forum SL & STL
    Réponses: 14
    Dernier message: 24/10/2005, 10h20

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