Un point du projet ISO N3290: Nom non qualifié Recherche: Section 3.4.1, para 14:
Si un membre variable d'un espace de noms est défini en dehors de la portée de son Espace de noms alors n'importe quel nom qui apparaît dans la définition du membre (après que le déclarant-id) est considéré comme si la définition du membre eu lieu dans son espace de noms. p> blockQuote> blockQuote>
ex: p>
xxx pré> existe-y une autre possibilité de prouver ce point autre que d'utiliser le mot-clé "extern '" p>
pouvez-vous donner Quelques autres exemples ... autres que extern p> p>
4 Réponses :
// header.h struct X { void bar () {} }; namespace N { struct X { void bar () {} }; void foo(X *p = new X); } // implementation.cpp #include"header.h" N::foo(X* p) { p->bar(); } // N::X::bar() called This example is without using extern. (though it's implied).
Vous pensez que n :: foo code> est un "membre variable d'un espace de noms"?
@ 6502, pas le n :: foo code>; Mais applicable à tous les membres de données variables à l'intérieur
N :: FOO CODE> :). OP a déjà donné l'exemple de variable externe.
Ensuite, votre réponse n'est pas pertinente: -1
Je ne vois toujours aucun "membre de la variable d'un espace de noms" ici, vous faites?
@ 6502, vous devriez voir foo (x * p = nouveau x) code>; où
x code> est une variable; Il peut être
:: x code> ou
n :: x code>.
Pour être juste, je ne pense pas que la partie variable i> est vraiment importante, le même comportement présent dans la citation d'ouverture de la définition des variables en dehors de son espace de noms existe pour des fonctions dans l'espace de noms. Qui étant dit, x code> dans le commentaire ci-dessus n'est pas une variable, c'est un type i>
@David, je sais que la partie variable n'est pas importante, mais depuis que je suis descendu simplement à cause de cela, j'ai changé mon code pour le satisfaire. Et aussi, je voulais dire le nouvel objet code> de
x code> en faisant référence au
foo (...) code>.
@David, je sais que la partie variable n'est pas importante, mais depuis que je suis descendu simplement à cause de cela, j'ai changé mon code pour le satisfaire. Et aussi, je voulais dire le nouvel objet code> de
x code> en faisant référence au
foo (...) code>.
Ce code n'utilise pas extern code>, mais il plus ou moins em> prouve le point. Notez qu'il ne définit pas variable em> à l'extérieur de l'espace de noms, il définit plutôt fonction em> à l'extérieur de l'espace de noms.
200
Vous avez posté deux fois. Au début, j'ai été consterné par la copie de Blatif, puis je me sentais stupide.
@Gman: C'est une réponse différente. Ce n'est pas un duplicata de mon autre réponse.
Vous devriez probablement les combiner, puis.
Un autre exemple qui n'utilise pas sortie: p> Démo en ligne : http://www.ideone.com/prvab P> p> extern code> mot-clé:
Vos deux exemples donneront des erreurs de liaison si Nomspace n code> fichier d'en-tête inclus dans plusieurs fichiers .cpp. Vous devez donc finir par utiliser
extern code> mot-clé pour
int i; code> :)
@iammilind: J'ai ajouté démo.cpp code> dans le commentaire, pour supprimer la possibilité d'erreur de liaison.
@iammilind: Etant donné que le i code> S ne fait pas partie du problème, vous pouvez toujours les déclarer comme
const int i = ...; code> et vous évitez ce problème.
Un autre exemple concerne la définition d'un membre statique
Ceci donne une erreur de liaison si, Namespace n code> inclus dans plusieurs fichiers .cpp. Vous devez faire extern b>
int i; code>.
Être difficile, oui. Mais il est déjà défini dans la portée des espaces de noms comme dans le code de l'OP. Donc, je ne pense pas que cela compte trop ici concernant le sujet que nous discutons.