Классы и пространства имен с одинаковыми именами в C ++ - PullRequest
15 голосов
/ 01 ноября 2010

Допустим, у меня есть класс с именем 'foo' в пространстве имен "abc" ...

namespace abc {
     class foo {
         int a;
         int b;
     };
}

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

#include "foo.h"

namespace foo {
    class abc {
        abc::a = 10;
    };
}

abc :: a не будет определенного типа, потому что он будет искать класс abc, а не пространство имен abc. Как бы я мог надлежащим образом ссылаться на объект в другом пространстве имен, в котором это другое пространство имен имело бы то же имя, что и мой класс?

Ответы [ 3 ]

23 голосов
/ 01 ноября 2010

Вы можете использовать ::abc::xx, то есть идентифицировать переменную или тип в качестве абсолютного пути к пространству имен.Если вы не укажете абсолютное имя, относительные имена начнут идти вверх во включающих пространствах имен / классах.

6 голосов
/ 01 ноября 2010

Вы можете использовать префикс :: для обозначения, начиная с глобального пространства имен, поэтому в вашем случае ::abc будет обозначать пространство имен abc из вашего первого фрагмента кода.

5 голосов
/ 01 ноября 2010

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

namespace abc {
   class foo {
       int a;
       int b;
   };
}

namespace foo {
  class abc {
      ::abc::foo a; // Changed from 'abc::a = 10;' since it doesn't compile
  };
}
...