Вложенные пространства имен в C ++ - PullRequest
30 голосов
/ 08 июля 2010

Меня смущает, что делать, когда есть вложенные пространства имен и объявления объектов.

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

Пример того, о чем я говорю:

namespace ABC {

    namespace XYZ {

        //STUFF
    }
}

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

если я попытаюсь:

XYZ::ClassA myobject;

или

ABC::XYZ::ClassA myobject;

или

ABC::ClassA myobject;

Я получаю

не называет тип

ошибок, хотя ClassA определенно существует.

Что здесь уместного?

Ответы [ 2 ]

47 голосов
/ 08 июля 2010

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

Если вы не находитесь ни в одном пространстве имен, ни в другом, не связанном с ним пространстве имен, вам нужно указать весь путь ABC::XYZ::ClassA.

Если вы находитесь в ABC, вы можете пропустить ABC и просто написать XYZ::ClassA.

Также стоит упомянуть, что если вы хотите сослаться на функцию, которая не находится в пространстве имен (или в «корневом» пространстве имен), вы можете добавить к ней префикс: :::

Пример:

int foo() { return 1; }

namespace ABC
{
  double foo() { return 2.0; }

  void bar()
  {
    foo(); //calls the double version
    ::foo(); //calls the int version
  }
}
5 голосов
/ 08 июля 2010

Если myobject объявлено в этом пространстве имен, и вы хотите объявить его снова (для определения), вы делаете это с префиксом его имени, а не его типа.

ClassA ABC::XYZ::myobject;

Если его тип также объявлен в этом пространстве имен, вам также необходимо добавить префикс имени типа

ABC::XYZ::ClassA ABC::XYZ::myobject;

Редко нужно заново объявлять такой объект. Часто первое объявление объекта также является его определением. Если вы хотите сначала объявить объект, вы должны сделать это в этом пространстве имен. Следующее объявляет и определяет «myobject»

namespace ABC {
  namespace XYZ {
    ClassA myobject;
  }
}

Если вы определили объект таким образом, вы ссылаетесь на него, говоря ABC::XYZ. Вам не нужно как-то «объявлять» этот объект, чтобы использовать его локально

void f() {
  ABC::XYZ::myobject = someValue;

  // you *can* however use a using-declaration
  using ABC::XYZ::myobject;
  myobject = someValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...