C ++ utilisant une déclaration d’espace de noms

namespace MyNamespace { static void foo1() { } } using namespace MyNamespace; class MyClass { void foo2() { ::foo1(); } }; 

L’opération de résolution de scope :: signifie l’utilisation de la méthode dans l’espace de noms global. Ici nous pouvons utiliser ::foo1() . Cela signifie que la méthode foo1() est dans l’espace de noms global, n’est-ce pas?

Ma question est la suivante: l’ using namespace ANAMESPACE_NAME signifie- using namespace ANAMESPACE_NAME que nous importons tous les éléments de l’espace de nom ANAMESPACE_NAME dans l’espace de nom global?

La section 3.4.3.4 de la norme C ++ 2003 a une réponse:

Un nom préfixé par l’opérateur de scope unaire :: (5.1) est recherché dans la scope globale, dans l’unité de traduction où il est utilisé. Le nom doit être déclaré dans la scope de l’espace de noms global ou doit être un nom dont la déclaration est visible dans la scope globale en raison d’une directive using (3.4.3.2).

Ce paragraphe est presque identique dans le FDIS C ++ 11, il en va probablement de même pour C ++ 11.

Non, “en utilisant l’espace de nom ANAMESPACE_NAME” signifie que nous importons tous les éléments dans la scope actuelle.

Vous pouvez écrire quelque chose comme ceci:

 namespace A { int i = 10, j = 20; } int f() { using namespace A; // injects names from A into the global scope. return i * j; // uses i and j from namespace A. } int k = i * j; // Error: undefined variant i and j. 

Ici nous pouvons utiliser :: foo1 (). Cela signifie que la méthode foo1 () est dans l’espace de noms global, n’est-ce pas?

Oui c’est correct. Cela signifie appeler la méthode nommée foo1() définie dans un espace de noms global. Cette opération s’appelle une recherche d’espace de noms qualifié .

“en utilisant l’espace de nom ANAMESPACE_NAME” signifie-t-il que nous importons tous les éléments de l’espace de nom ANAMESPACE_NAME dans un espace de nom global?

Oui, tous les éléments de l’espace de nom ANAMESPACE_NAME dans l’espace de nom actuel.
Cela s’appelle une directive using .
Si vous souhaitez importer uniquement un élément spécifique dans le type actuel, utilisez déclaration .

le format est:

using ANAMESPACE_NAME :: nom_élément;