9
votes

Résolution Typedef à travers les espaces de noms

Je suis actuellement confondu avec la façon dont "en utilisant (espaces de noms)" Les déclarations fonctionnent en C ++.

J'ai: xxx

résultats (paraphrasé):
la référence à 'uint' est ambiguë. Les candidats sont de
Typedef non signé int uint
et
Typedef non signé Int Mine :: uint

Pendant ce temps, quand je fais xxx

tout fonctionne bien. Il me semble étrange que "en utilisant identifiant ;" Modifie la visibilité d'une autre définition TLEDEF (dissimule le global?). Quelqu'un peut-il me signaler quel type de règles en C ++ régir la résolution de Typefs à travers les espaces de noms?


1 commentaires

Quel espace de noms une déclaration rendue visible en raison d'une directive à l'aide d'une directive (par opposition à une déclaration à l'aide de la déclaration) est un duplicata exact du problème dans Exceptionnel c ++ [bug]?


4 Réponses :


5
votes

Votre code d'origine confond le compilateur, car l'UTINT peut être soit

::mine::uint


2 commentaires

Est-ce vraiment le cas, c'est-à-dire "à l'aide de la mine :: xxx" précise explicitement que chaque fois que xxx se produit dans le code, il sera résolu à la mine :: xxx. "Utilisation de la mine d'espace de noms" ne fait pas la même chose pour tous les identificateurs de la mine d'espace de noms?


Je pense que les réponses ci-dessous répond suffisamment à vos questions.



0
votes

Cela ne dissimule pas le global. C'est pourquoi vous avez l'ambiguïté.


0 commentaires

1
votes

Je ne peux pas citer le chapitre et le verset pour vous, mais cela a du sens pour moi. Si le compilateur ne peut pas trouver le symbole uint dans l'espace de noms actuel, il apparaît à d'autres espaces de noms pour voir s'il peut trouver le symbole là-bas. Puisqu'il le trouve dans deux autres espaces de noms, il est ambigu.

Lorsque vous avez dit à l'aide de la mine :: uint Vous avez importé ce symbole dans le bloc actuel, il est donc trouvé avant que les autres espaces de noms ne doivent être vérifiés.


0 commentaires

13
votes

Nom rendue visible par un à l'aide de la directive apparaît dans la portée de la société la plus proche contenant [- directement ou indirectement -] les à l'aide de la directive et de l'espace de noms nominé et de nomination . (7.3.4 [Nomspace.udir])

Cela signifie que les deux uint déclarations apparaissent à la portée des espaces de noms globaux lors de la surveillance après la à l'aide de la directive dans autre / code>.

A utiliser-déclaration , comme toute autre déclaration, déclare un nom à la portée dans laquelle il apparaît. C'est pourquoi, dans le deuxième exemple, à l'aide de la mine :: uint; masque le uint introduit par à l'aide de la mine d'espace de noms; comme ce dernier semble venir de la portée globale.


0 commentaires