Использование пространства имен только внутри одного конкретного файла класса - PullRequest
3 голосов
/ 05 августа 2011

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

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

namespace SomeNamespace
{
   class MyClass
   {
      //...

      //These types of namespace uses occur alot around here:
      void DoSomething(const anothernamespace::anotherclass &arg);
      //...
   }
}

Этот класс, конечно, находится в своем собственном файле .hpp.

Я бы хотел, чтобы все внутри пространства имен "anothernamespace" было доступно классу MyClass, однако, если бы я просто выразился так:

namespace SomeNamespace
{
   using namespace anothernamespace;
   class MyClass
   {
      //...

      //These types of namespace uses occur alot around here:
      void DoSomething(const anothernamespace::anotherclass &arg);
      //...
   }
}

Тот, кто делает

using namespace SomeNamespace;

Будет также автоматически использовать другое пространство имен - чего я хочу избежать.

Как мне добиться того, чего я хочу?

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Самое простое, не идеальное, но помогающее решение - использовать псевдоним пространства имен:

namespace SomeNamespace
{
   namespace ans = anothernamespace; // namespace alias
   class MyClass
   {
      //...

      //These types of namespace uses occur alot around here:
      void DoSomething(const ans::anotherclass &arg);
      //...
   }
}

Ваши ученики не будут «использовать пространство имен другое пространство имен», делая его более безопасным, но вы все равнодолжны использовать псевдоним в вашем классе.Не уверен, что это помогает, это зависит от того, хотите ли вы просто печатать меньше или, возможно, скрыть тип.Здесь вы помещаете полное пространство имен в своего рода подпространство имен, которое не попадает в пространства имен пользователя, но все еще доступно.

В противном случае ... нет способа сделать именно то, что вы хотите.Использование пространства имен не работает внутри объявлений классов.

3 голосов
/ 05 августа 2011

Это делает то, что вы хотите. Оба пространства имен доступны для MyClass. using namespace это плохая практика в заголовках.

namespace SomeNamespace {
namespace other {
  using namespace anothernamespace;
  class MyClass {
  };
}}

namespace SomeNamepace {
  typedef other::MyClass MyClass;
}

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

2 голосов
/ 05 августа 2011

Вы не можете.Боюсь, все просто.

...