Вопрос о пространстве имен - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть быстрый вопрос о области пространства имен:

  1. У меня есть два пространства имен, A и B, где B вложено в A.
  2. Я объявляю некоторые typedefs внутри A.
  3. Я объявляю класс внутри B (который находится внутри A)

Чтобы получить доступ к typedefs (объявленным в A), изнутри B, мне нужно сделать "с использованием пространства имен A; "

т.е.:

B.hpp:

using namespace A;

namespace A {
namespace B {

  class MyClass {

    typedeffed_int_from_A a;
  };

}
}

Это кажется избыточным ... Это правильно?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Чтобы получить доступ к typedefs (объявленным в A), изнутри B, мне нужно сделать «использование пространства имен A;»

Нет.


Однако, если есть typedef или какой-либо другой символ с тем же именем, что и ваш typedef, определенный в пространстве имен B, то вам нужно написать это:

A::some_type a;

Давайте сделаем простой эксперимент, чтобы понять это.

Рассмотрим этот код: ( необходимо прочитать комментарии )

namespace A
{
   typedef int some_type; //some_type is int

   namespace B
   {
        typedef char* some_type;  //here some_type is char*

        struct X
        {
               some_type     m; //what is the type of m? char* or int?
               A::some_type  n; //what is the type of n? char* or int?
        };

        void f(int) { cout << "f(int)" << endl; }
        void f(char*) { cout << "f(char*)" << endl; }
   }
}

int main() {
        A::B::X x;
        A::B::f(x.m);
        A::B::f(x.n);
        return 0;
}

Выход:

f(char*)
f(int)

Это доказывает, что тип из m равен char*, а тип из n равен int как ожидалось или предполагалось.

Онлайн демо: http://ideone.com/abXc8

4 голосов
/ 11 апреля 2011

Нет, вам не нужна директива using; поскольку B вложено в A, содержимое A находится внутри области действия B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...