7
votes

L'espace de noms anonyme enfermez-vous tous les espaces de noms?

En C ++, vous spécifiez la liaison interne en enveloppant vos définitions de classe et de fonction dans un espace de noms anonyme. Vous pouvez également explicitement instantiez des modèles, mais d'être conformes aux normes conformes aux instanciations explicites des modèles doivent se produire dans la même espace de noms. Afaict Cela devrait compiler, mais GCC échoue à ce sujet: xxx

avec l'erreur: xxx

ce qui est intéressant parce que l'espace de noms anonyme devrait simplement Selon la spécification du lien, ne fonctionnant pas vraiment comme un espace de noms, et l'espace de noms global entoure définitivement FOO, car il engloutit chaque espace de noms. Mais même cela ne fonctionne pas!: xxx

qui échoue avec la même erreur, indique simplement l'espace de noms global à la place: xxx

: /


1 commentaires

Quelle version de GCC - ou quelles options de compilateur - ou quelle plate-forme? J'ai essayé le premier échantillon avec G ++ 4.0.1 sur MacOS X avec et sans-wall et compilé sans plainte ni avertissement.


4 Réponses :


6
votes

Je pense que vous avez votre réponse - les espaces de noms anonymes sont des espaces de noms uniques distincts. Entre, le compilateur génère un grand nombre aléatoire pour représenter cet espace de noms en interne.


0 commentaires

0
votes

Selon Stroustrup (Section 8.2.5.1) L'espace de noms global a accès à l'espace de noms anonyme (Sans nom), mais cela ne dit pas explicitement l'inverse.

Je pense que vous devriez spécifier l'espace de noms avec une déclaration à l'aide d'une déclaration ou qualifier complètement les références à d'autres espaces de noms à l'intérieur de l'espace de noms non nommé ...


0 commentaires

7
votes

Premier: vous êtes explicitement instanciant d'un modèle de classe, vous ne définissez pas un nouveau modèle de classe. Qu'est-ce que xxx

dit est "Veuillez instancier la barre de modèle de classe pour le type INT ici". Vous ne pouvez pas le faire dans un autre espace de noms, tout comme vous ne pouvez pas spécialiser partiellement un modèle de classe dans un autre espace de noms. En particulier, le modèle à explicitement instancié doit avoir été défini et dans votre exemple, il n'y a pas (espace de noms anonyme) :: bar <>, seulement foo :: bar <>.

Deuxième: l'anonyme Espace de noms est un espace de noms réel (il est distinct dans chaque unité de traduction, cependant). Cela ne modifie pas comme par magie le lien. Tout ce qui est déclaré à l'intérieur de l'espace de noms {} a toujours le lien par défaut, tout comme à toute autre périmètre d'espace de noms. IIRC, il a même été ajouté pour permettre des objets de traduction de l'unité-privé, mais de la liaison externe.


0 commentaires

10
votes

Un espace de noms anonyme est logiquement équivalent à xxx

un espace de noms, anonyme ou autre, n'a aucun effet sur la liaison de ses membres. En particulier, des membres d'un espace de noms anonyme ne reçoivent pas par magie la liaison interne.


2 commentaires

J'ajouterai l'évidence, ce qui est que le contenu dans _Tu_Specific_unique_generated_name ne peut pas être utilisé en dehors du fichier.


Il est en fait décrit cette manière exacte dans la norme, acceptée.