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 namespaces résolution de "ambiguous"


Sujet :

C++

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut Les namespaces résolution de "ambiguous"
    Bonjour à tous, suite à une utilisation de windows.h, je me retrouve avec des problèmes lors des utilisations de using namespace sf; (j'utilise la SFML).

    D'apès ce que j'ai compris, si j'ai une fonction Sleep qui traine en dehors de tout namespace et que j'ai une autre fonction Sleep dans le namespace sf, si j'utilise pas using namespace sf, si je ne met pas sf::Sleep(), se sera la fonction windows de Sleep.
    Cependant, si je met using namespace sf, et que je met Sleep(), ce devrait être le Sleep windows appelé.

    Je me trompe ?

    Si non, pourquoi avec gcc4.5 en c++0x, ai-je ambiguous function call ? (avec using namespace sf; int main(){Sleep(1);return 0;}

    Si oui, comment faire pour pouvoir utiliser les fonctions SFML sans mettre sf partout tout sans pour autant empêcher l'utilisation des fonctions windows :
    En effet, les fonctions windows n'étant dans aucun namespace, on de peut faire windows::Sleep.

    Merci de votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, je ne connais pas le namespace sf, mais ce que je vais te dire avec le namespace std sera la même chose.

    Si tu mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    using namespace std;
    using namespace MonNamespace;
    dans ton .cpp, tu pourras avoir une ambiguité. Exemple, si tu as une fonction std::cout et MonNamespace::cout, quelle fonction faut-il utiliser ?

    C'est pourquoi, je recommande très vivement de ne jamais mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using namespace NomDuNamespace
    mais de mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    using NomDuNamespace::fonction1;
    using NomDuNamespace::fonction2;
    du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using std::vector;
    using std::string;
    using std:cout,
    using std::endl;
    Ainsi tes problèmes d'ambiguité seront résolus

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Je connais bien l'utilité de using et using namespace. Cependant, dans la majorité des cas, using namespace est très utile et ne pose pas de problème car on peut lever l'ambiguïté avec namespace::truc.
    Cependant, dans mon cas les fonctions windows.h de sont pas dans un namespace.

    Or , il me semble que même si j'ai :

    namespace toto
    {
    void*malloc(size_t);
    };

    avec using namespace toto;
    Il n'y aurait pas de conflit entre malloc(stdlib.h) et mon malloc.
    Pourquoi y en aurait-il dans le cas de windows.h et using namespace sf ?

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    Cependant, si je met using namespace sf, et que je met Sleep(), ce devrait être le Sleep windows appelé.

    Je me trompe ?
    Oui. C'est ambigu.

    Si oui, comment faire pour pouvoir utiliser les fonctions SFML sans mettre sf partout tout sans pour autant empêcher l'utilisation des fonctions windows :
    En effet, les fonctions windows n'étant dans aucun namespace, on de peut faire windows::Sleep.
    ::Sleep
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Merci beaucoup, je ne savais pas qu'on pouvais mettre ::Sleep sans namespace avant les ::

    Sujet résolut.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Sincèrement, j'ai du mal à évaluer l'usure du clavier lorsqu'on écrit sf::Sleep...

    D'autant que lorsque plusieurs bibliothèques sont utilisées, le code est quand même beaucoup plus lisible si on utilise explicitement chaque namespace. Au moins, si on tombe sur un identifiant non connu, on sait vers quelle aide se retourner. Ce qui n'est plus le cas si le namespace est absent.

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

Discussions similaires

  1. [MySQL] Supprimer les erreurs de syntaxe dues aux quotes
    Par gotenks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2006, 16h10

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