11
votes

Pourquoi prépender l'espace de nom avec ::, par exemple :: std :: vecteur

J'ai vu du code de production tel que xxx

je n'ai aucune idée de ce que le :: signifie cependant - et pourquoi est-il utilisé?

Pour un exemple, voir:

C ++: une bonne façon de itérer sur les conteneurs STL


0 commentaires

5 Réponses :


3
votes

Ceci toujours prend le vecteur de la bibliothèque standard. std :: vecteur peut aussi bien être mycompany :: std :: vecteur si le code où je l'utilise est dans la zone de noms espace mycompany .


2 commentaires

Alors le :: signifie "le début de l'arbre d'espace de noms"?


Oui. Les commentaires doivent avoir au moins 15 caractères.



2
votes

commençant par :: signifie réinitialiser l'espace de noms à l'espace de noms global. Cela pourrait être utile si vous essayez de combattre une certaine ambiguïté dans votre code.


0 commentaires

6
votes

Le premier "::" fait référence à l'espace de noms global. Supposons que vous dites espaces de noms foo {... . Puis std :: bar fait référence à foo :: std :: bar , tandis que :: std :: bar fait référence à std: : Bar , ce qui est probablement ce que l'utilisateur signifiait. Donc toujours, y compris la première "::" peut vous protéger contre vous référant au mauvais espace de noms, si vous n'êtes pas sûr de l'espace de noms que vous êtes actuellement.


7 commentaires

Cependant, std :: vecteur ne fera référence que foo :: std :: vecteur s'il y en fait un. Hautement improbable! Sinon, il trouvera :: std :: vecteur quand même.


@Bo: Non. Par exemple, dans l'exemple que je présente ci-dessous, si vous avez supprimé la définition de NS :: std :: vecteur , la déclaration de v1 dans NS :: f () échouerait.


@James: OK, si vous avez réellement un espace de noms local STD sans vecteur, le compilateur vous dira qu'il est manquant. Ce n'est pas une très bonne raison de Toujours Utiliser: Devant tout. Si vous n'avez pas d'espace de noms local Std, le STD normal :: Vecteur sera trouvé de toute façon, même si vous êtes dans un autre espace de noms.


@Bo: je suis d'accord; Il est rare de voir les noms pleinement qualifiés et, en général, cela n'est pas nécessaire.


@Bo: Vous avez raison, j'aurais dû dire "essaie de trouver" plutôt que "désignant". Peut-être que quelqu'un peut fournir un lien vers une description complète du processus de résolution de la portée.


Juste un exemple de travail dans lequel je suis tombé à travers aujourd'hui - j'ai eu un code préexistant non-répit qui a été renvoyé à un autre espace de noms sans le préfixe :: . J'ai déplacé ce code préexistant dans son propre espace de noms, ce qui a annoncé toutes les références d'espace de noms - ils ont tous besoin du préfixe :: ajouté, partout. Si l'auteur d'origine avait utilisé le préfixe :: en premier lieu, il aurait été moins douloureux maintenant. Ou avez-je manqué quelque chose de fondamental ici?


@meowsQuak: Eh bien, les problèmes sont avec ambiguïtés plutôt que de trouver quoi que ce soit du tout. Le nom foo :: x est recherché d'abord dans le contexte de l'espace de noms actuel, mais successivement dans les espaces de noms enfermés, jusqu'à ce qu'une correspondance soit trouvée.



21
votes

Ceci qualifie pleinement le nom, de sorte que seul le modèle code> vecteur code> dans l'espace de noms code> std code> dans l'espace de noms global est utilisé. Cela signifie fondamentalement:

#include <vector>

namespace ns
{
    namespace std
    {
        template <typename T> class vector { };
    }

    void f() 
    { 
        std::vector<int> v1;   // refers to our vector defined above
        ::std::vector<int> v2; // refers to the vector in the Standard Library
    }        
};


3 commentaires

Il semble également y avoir un problème, même si ns :: std ne déclare pas de vecteur.


@Unclebens: un excellent point. Le :: NS :: std serait trouvé et s'il ne contenait pas d'entité nommée vecteur , la recherche de nom échouerait.


Bonne réponse. J'ajouterais que STD n'est pas un excellent choix pour les cas d'utilisation normale. Cela entraînerait généralement une confusion sur la partie utilisateur finale.



4
votes

Prendre un exemple -

int variable = 20 ;

void foo( int variable )
{

    ++variable;      // accessing function scope variable
    ::variable = 40;  // accessing global scope variable
}


0 commentaires