Je sais que l'imbrication d'espaces de noms est autorisée en C ++ / CLI. Donc ma question est si nous avons quelque chose comme ceci:
...
namespace one
{
// blah blah blah
// ...
namespace two
{
// another set of blah blah blah
// ...
}
}
et j'ai besoin d'utiliser des fonctions et des variables dans espace de noms deux, est-ce que j'utilise:
one::two
ou
one.two
Une autre question est que si j'ai une déclaration comme
using namespace one;
ai-je accès à des variables et à des fonctions dans des espaces de noms imbriqués comme
namespace two
Je pose la question parce que, dans certains programmes que j'ai vus (et écrits), il y a quelque chose comme:
using namespace System;
using namespace System::Text;
using namespace System::IO;
N'est-ce pas Système espace de noms censé couvrir la Système :: Texte et Système :: IO espaces de noms?
Réponses:
4 pour la réponse № 1Vous devez utiliser
one::two::some_variable_or_function
le .
l'opérateur est pour accéder non statique struct
/class
membres. Les membres statiques sont à nouveau accessibles via l'opérateur de résolution d'étendue ::
.
Si seulement vous utilisiez using System;
, vous pouvez accéder au System::Text
fonctions / variables par
Text::some_function_or_variable
using
L'espace de noms parent n'implique pas l'importation de tous les sous-espaces de noms.
3 pour la réponse № 2
Oui, vous avez besoin d'utilisation
one::two
au lieu deone.two
accéder aux symboles dans un espace de noms imbriqué.Si vous venez d'utiliser
namespace one;
vous n’avez pas automatiquement accès à l’espace de noms imbriqué. Vous devrez utilisertwo::
Exemple:
namespace one
{
int i;
namespace two
{
int j;
}
}
Si tu utilises:
using namespace one;
Votre code ressemble à:
i = 1;
two::j = 2;
Si tu utilises:
using namespace one;
using namespace one::two;
Votre code ressemble à:
i = 1; //Compile fails if no "using namespace one".
j = 2;
2 pour la réponse № 3
un deux
ou
one.two
Vous devez utiliser un deux. one.two est la syntaxe de paquet accès dans Java
Une autre question est que si j'ai un déclaration comme
using namespace one;
ai-je accès aux variables et fonctions dans tous les espaces de noms imbriqués comme
espace de noms deux
Non, vous pouvez les utiliser comme two::
au lieu de one::two::
Je demande parce que, dans certains programmes, je ont vu (et écrit), il y a quelque chose comme:
using namespace System;
using namespace System :: Text;
using namespace System :: IO;L'espace de noms système n'est-il pas supposé couvrir le système :: texte et système :: IO espaces de noms?
Non, ils ne sont pas les mêmes. Vous devez spécifier usage de chaque espace de noms enfant.
2 pour la réponse № 4
En général, vous utilisez le point uniquement lorsque vous faites référence à un membre d’une instance, et ::
partout ailleurs. Donc, pour accéder à des éléments de votre espace de noms two
, tu appellerais ça one::two::whatever
.
Pour ce qui est de using namespace System;
, il "d importer des trucs du System
espace de noms. Tandis que System::IO
et System::Text
sont dans System
, il ne les "importe pas directement dans l’espace de nommage actuel. Si vous le voulez bien, vous pourrez dire using namespace System;
puis faites référence à une classe dans un espace de noms imbriqué comme, par exemple, IO::Stream
. Mais cela deviendrait vite déroutant si vous utilisiez plusieurs espaces de noms.
0 pour la réponse № 5
1) un :: deux
2) using
un espace de noms parent ne développe pas automatiquement aucun espace de noms imbriqué.