Подтвердить что ты не робот

Вложенные NameSpaces в С++

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

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

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

namespace ABC {

    namespace XYZ {

        //STUFF
    }
}

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

если я попробую:

XYZ::ClassA myobject;

или

ABC::XYZ::ClassA myobject;

или

ABC::ClassA myobject;

Я получаю

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

хотя ClassA определенно существует.

Что здесь нужно?

4b9b3361

Ответ 1

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

Если вы не используете пространство имен или другое несвязанное пространство имен, тогда вам нужно указать весь путь 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
  }
}

Ответ 2

Если в этом пространстве имен объявлено 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;
}