/ / Imbrication d'espaces de noms en C ++ / CLI - visual-c ++, espaces de noms, c ++ - cli, imbriqué, managé-c ++

Imbrication d'espaces de noms dans C ++ / CLI - visual-c ++, espaces de noms, c ++ - cli, imbriqué, managé-c ++

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 № 1

Vous 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
  1. Oui, vous avez besoin d'utilisation one::two au lieu de one.two accéder aux symboles dans un espace de noms imbriqué.

  2. Si vous venez d'utiliser namespace one; vous n’avez pas automatiquement accès à l’espace de noms imbriqué. Vous devrez utiliser two::

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é.