typedef résolution à travers les espaces de noms
Je suis actuellement en train de confondre avec la voie "à l'aide de (espace de noms)" les déclarations en C++.
J'ai:
//somewhere in included headers
typedef unsigned int uint;
namespace mine {
typedef unsigned int uint;
}
namespace other {
using namespace mine;
void foobar () {
uint offender = i;
}
}
Résultats (paraphrasé):
référence à la "uint" est ambigu.
les candidats sont
typedef unsigned int uint
typedef unsigned int mine::uint
Pendant ce temps, quand je ne
namespace other {
using namespace mine;
using mine::uint;
void foobar () {
uint offender = i;
}
}
Tout fonctionne bien.
Il me semble étrange que "l'utilisation de identificateur;" les changements de la visibilité des autres typedef définition (cache le mondial?).
Quelqu'un peut-il m'indiquer quel genre de règles en C++ régissent la résolution des typedefs à travers les espaces de noms?
Espace de noms une déclaration rendue visible grâce à une aide de la directive (par opposition à une déclaration using) apparaît en est une copie exacte de la question Exceptionnel C++[Bug]?
OriginalL'auteur Marcin K | 2011-02-17
Vous devez vous connecter pour publier un commentaire.
Un nom rendue visible par un à l'aide de la directive apparaît dans le plus proche du cadre englobant qui contient [- directement ou indirectement -] à la fois le à l'aide de la directive et la nomination d'espace de noms. (7.3.4 [espace de noms.udir])
Cela signifie que les deux
uint
déclarations apparaissent à l'espace de noms global de la portée quand on les regarde après le à l'aide de la directive dansother
.Un aide-déclaration, comme toute autre déclaration, déclare un nom au champ d'application dans lequel il apparaît. C'est pourquoi, dans le deuxième exemple,
using mine::uint;
cache lauint
introduit parusing namespace mine;
que ce dernier semble provenir de la portée globale.OriginalL'auteur CB Bailey
Votre code d'origine confond le compilateur, parce que le uint peut être
ou
donc compilateur renvoie ce message d'erreur pour vous. Dans le "fix", à l'aide de
mine::uint
explicitement précisé que::mine::uint
doit être préféré.Cependant,
typedef
conflit doit être évitée, de l'OMI. Il rend le code difficile à maintenir.Je pense que les réponses ci-dessous sont suffisamment répondre à vos questions.
OriginalL'auteur Peon the Great
Je ne peux pas citer le chapitre et le verset pour vous, mais pour moi c'est logique. Si le compilateur ne peut pas trouver le symbole
uint
dans l'espace de noms courant, il ressemble à d'autres espaces de noms pour voir si il peut trouver le symbole. Depuis qu'il trouve dans les deux autres espaces de noms, il est ambigu.Quand vous avez dit
using mine::uint
vous importés de ce symbole dans le bloc en cours, il est donc trouvé devant les autres espaces de noms doivent être vérifiés.OriginalL'auteur Mark Ransom
Il ne doit pas dissimuler l'échelle mondiale. C'est pourquoi vous avez l'ambiguïté.
OriginalL'auteur Marcelo Cantos