Je suis actuellement confondu avec la façon dont "en utilisant (espaces de noms)" Les déclarations fonctionnent en C ++.
J'ai: p> résultats (paraphrasé): Pendant ce temps, quand je fais p> tout fonctionne bien.
Il me semble étrange que "en utilisant identifiant em>;" 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? P> P>
la référence à 'uint' est ambiguë.
Les candidats sont de
Typedef non signé int uint
et
Typedef non signé Int Mine :: uint em> p>
4 Réponses :
Votre code d'origine confond le compilateur, car l'UTINT peut être soit
::mine::uint
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.
Cela ne dissimule pas le global. C'est pourquoi vous avez l'ambiguïté. P>
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 Lorsque vous avez dit uint code> 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. P>
à l'aide de la mine :: uint code> 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. P>
Nom rendue visible par un à l'aide de la directive em> apparaît dans la portée de la société la plus proche contenant [- directement ou indirectement -] les à l'aide de la directive em> et de l'espace de noms nominé et de nomination . (7.3.4 [Nomspace.udir]) P>
Cela signifie que les deux A utiliser-déclaration em>, 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, uint code> déclarations apparaissent em> à la portée des espaces de noms globaux lors de la surveillance après la à l'aide de la directive em> dans
autre
/ code>. p>
à l'aide de la mine :: uint; code> masque le
uint code> introduit par
à l'aide de la mine d'espace de noms; code> comme ce dernier semble venir de la portée globale. p>
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]?