J'ai vu du code de production tel que je n'ai aucune idée de ce que le Pour un exemple, voir: P> C ++: une bonne façon de itérer sur les conteneurs STL p> p> :: code> signifie cependant - et pourquoi est-il utilisé? P>
5 Réponses :
Ceci toujours em> prend le vecteur code> de la bibliothèque standard.
std :: vecteur code> peut aussi bien être
mycompany :: std :: vecteur code> si le code où je l'utilise est dans la zone de noms espace
mycompany code>. p>
Alors le :: signifie "le début de l'arbre d'espace de noms"?
Oui. Les commentaires doivent avoir au moins 15 caractères.
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. P>
Le premier "::" fait référence à l'espace de noms global. Supposons que vous dites espaces de noms foo {... code>. Puis
std :: bar code> fait référence à
foo :: std :: bar code>, tandis que
:: std :: bar code> fait référence à
std: : Bar code>, 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. P>
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 code>, la déclaration de
v1 code> dans
NS :: f () code> é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 B> 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 :: code>. 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
:: code> ajouté, partout. Si l'auteur d'origine avait utilisé le préfixe
:: code> 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 i> plutôt que de trouver quoi que ce soit du tout. Le nom foo :: x code> 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.
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 } };
Il semble également y avoir un problème, même si ns :: std code> ne déclare pas de vecteur.
@Unclebens: un excellent point. Le :: NS :: std code> serait trouvé et s'il ne contenait pas d'entité nommée
vecteur code>, 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.
Prendre un exemple -
int variable = 20 ; void foo( int variable ) { ++variable; // accessing function scope variable ::variable = 40; // accessing global scope variable }