Вложенные NameSpaces в С++
Я смущен, что делать, когда у вас есть вложенные пространства имен и объявления объектов.
Я переношу некоторый код, который ссылается на статическую библиотеку с несколькими пространствами имен.
Пример того, о чем я говорю:
namespace ABC {
namespace XYZ {
//STUFF
}
}
В коде, что я делаю, чтобы объявить объект, который находится в пространстве имен XYZ
?
если я попробую:
XYZ::ClassA myobject;
или
ABC::XYZ::ClassA myobject;
или
ABC::ClassA myobject;
Я получаю
не называет тип
хотя ClassA
определенно существует.
Что здесь нужно?
Ответы
Ответ 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;
}