Вложение пространства имен в C ++ / CLI - PullRequest
1 голос
/ 15 июня 2011

Я знаю, что в C ++ / CLI разрешено вложение пространств имен.Поэтому мой вопрос: если у нас есть что-то вроде этого:

...
namespace one
{
    // blah blah blah
    // ...

    namespace two
    {
        // another set of blah blah blah
        // ...
    }
}

, и мне нужно использовать некоторые функции и переменные в пространстве имен два , я должен использовать:

one::two

или

one.two

Другой вопрос заключается в том, что если у меня есть такое утверждение, как

using namespace one;

, могу ли я получить доступ к переменным и функциям в любых вложенных пространствах имен, например

namespace two

Я спрашиваю, потому что в некоторых программах, которые я видел (и писал), есть что-то вроде:

using namespace System;
using namespace System::Text;
using namespace System::IO;

Разве это не Система пространство имен должно охватывать пространства имен System :: Text и System :: IO ?

Ответы [ 5 ]

4 голосов
/ 15 июня 2011

Вам необходимо использовать

one::two::some_variable_or_function

Оператор . предназначен для доступа к нестатическим struct / class членам.Затем к статическим элементам снова можно получить доступ через оператор разрешения области действия ::.

Если вы используете только using System;, вы можете получить доступ к System::Text функциям / переменным с помощью

Text::some_function_or_variable

using родительское пространство имен не подразумевает импорт всех подпространств имен.

3 голосов
/ 15 июня 2011
  1. Да, вам нужно использовать one::two вместо one.two для доступа к символам во вложенном пространстве имен.

  2. Если вы просто используете namespace one;, у вас нет автоматического доступа к вложенному пространству имен. Вам придется использовать two::

Пример:

namespace one
{
    int i;

    namespace two
    {
        int j;
    }
}

Если вы используете:

using namespace one;

Ваш код выглядит так:

i = 1;
two::j = 2;

Если вы используете:

using namespace one;
using namespace one::two;

Ваш код выглядит так:

i = 1; //Compile fails if no "using namespace one".
j = 2;
2 голосов
/ 15 июня 2011

один :: два

или

one.two

Вам нужно использовать one :: two . one.two - это синтаксис для пакета доступа в Java

Другой вопрос: если у меня есть заявление как

с использованием пространства имен один;

есть ли у меня доступ к переменным и функции в любых вложенных пространствах имен как

пространство имен два

Нет , вы можете использовать их как two:: вместо one::two::

Я спрашиваю, потому что в некоторых программах я видел (и писал), есть что-то вроде:

с использованием системы пространств имен;
используя пространство имен System :: Text;
используя пространство имен System :: IO;

Разве пространство имен System не должно охватывают Систему :: Текст и Систему :: IO Пространства имен?

Нет , они не одинаковы. Вы должны указать использование каждого дочернего пространства имен.

2 голосов
/ 15 июня 2011

Как правило, вы используете точку только тогда, когда обращаетесь к члену экземпляра, а :: везде.Таким образом, чтобы получить доступ к содержимому в вашем пространстве имен two, вы бы назвали его one::two::whatever.

Что касается using namespace System;, то он импортирует материал из пространства имен System.Пока System::IO и System::Text находятся в System, он не импортирует их непосредственно в текущее пространство имен.AFAIK, вы могли бы сказать using namespace System;, а затем сослаться на класс во вложенном пространстве имен, как, скажем, IO::Stream.Но это быстро сбивает с толку, если вы используете кучу пространств имен.

0 голосов
/ 15 июня 2011

1) один :: два
2) using родительское пространство имен не расширяет автоматически вложенное пространство имен.

...