Using namespace

Директива_using_namespace импортирует типы, содержащиеся в пространстве имен, в непосредственно вмещающую единицу компиляции или тело пространства имен, что позволяет использовать идентификатор каждого типа без уточнения.

директива_using_namespace:
using имя_пространства_имен ;

Внутри объявлений членов в единице компиляции или теле пространства имен, содержащем директиву_using_namespace, на типы в данном пространстве имен можно ссылаться непосредственно. Пример:

namespace N1.N2
{
class A {}
}

namespace N3
{
using N1.N2;

class B: A {}
}

В данном примере внутри объявлений членов в пространстве имен N3 члены типа N1.N2 доступны непосредственно, и таким образом класс N3.B является производным от класса N1.N2.A.

Директива_using_namespace импортирует типы, содержащиеся в данном пространстве имен, но не импортирует вложенные пространства имен. В этом примере

namespace N1.N2
{
class A {}
}

namespace N3
{
using N1;

class B: N2.A {} // Error, N2 unknown
}

директива_using_namespace импортирует типы, содержащиеся в N1, но не пространства имен, вложенные в N1. Таким образом, ссылка на N2.A в объявлении B приводит к ошибке времени компиляции, так как в области нет членов с именем N2.

В отличие от директивы_using_alias, директива_using_namespace может импортировать типы, идентификаторы которых уже определены внутри вмещающей единицы компиляции или тела пространства имен. В действительности, имена, импортированные директивой_using_namespace, скрыты членами с тем же именем во вмещающей единице компиляции или теле пространства имен. Например:

namespace N1.N2
{
class A {}

class B {}
}

namespace N3
{
using N1.N2;

class A {}
}

В данном случае внутри объявлений членов в пространстве имен N3, A ссылается на N3.A, а не на N1.N2.A.

Если более одного пространства имен, импортированных директивами_using_namespace в одну и ту же единицу компиляции или тело пространства имен, содержат типы с одинаковым именем, ссылки на эти типы считаются неоднозначными. В этом примере

namespace N1
{
class A {}
}

namespace N2
{
class A {}
}

namespace N3
{
using N1;

using N2;

class B: A {} // Error, A is ambiguous
}

N1 и N2 содержат член A, а поскольку N3 импортирует оба, ссылка на A в N3 дает ошибку времени компиляции. В этой ситуации можно разрешить конфликт либо квалифицируя ссылки на A, либо введя директиву_using_alias, выбирающую отдельный A. Например:

namespace N3
{
using N1;

using N2;

using A = N1.A;

class B: A {} // A means N1.A
}

Как и директива_using_alias, директива_using_namespace не размещает новые члены в базовой области объявлений единицы компиляции или пространства имен, а влияет только на единицу компиляции или тело пространства имен, в котором находится.

Имя_пространства_имен, на которое ссылается директива_using_namespace, разрешается таким же образом, как имя_пространства_имен_или_типа, на которое ссылается директива_using_alias. Таким образом, директивы_using_namespace в одной и той же единице компиляции или теле пространства имен не влияют друг на друга и могут быть записаны в любом порядке.