692 ____Часть IV. Новые возможности C++

Data:: i остается в своем пространстве и доступна только с использованием полного префикса. Попытка вывести i без уточнения вызывает ошибку — неопределенный символ.

Вторая часть main о поднимает на текущий уровень области видимости целиком все пространство Functions. Функция Funcio теперь может действовать так, как если бы она принадлежала текущему уровню. Здесь появляется конфликт имен функций Bark о. Есть глобальная функция Bark о, и есть функция Bark о из пространства имен Functions. Компилятор допускает совпадение имен только потому, что мы не пытаемся использовать Bark о без уточнения. Как было показано .выше, глобальную версию всегда можно вызвать как :: Bark ().

Последняя часть main () поднимает все пространство Dog, которое тоже имеет свою функцию Bark (). Теперь мы имеем тройной конфликт имен: между глобальной функцией Bark(), функцией Bark о из пространства Function и функцией Bark о из пространства Dog. Когда компилятор, после того как было поднято пространство Dog, встречает вызов Bark о, он встает в тупик, не понимая, которая функция Bark() должна быть вызвана — одна из двух поднятых или глобальная — и сообщает об ошибке. Однако если функцию не вызывать вообще, то несмотря на конфликт имен ошибка выдана не будет.

Директива using обладает свойством транзитивности, что означает, что если на некотором уровне поднято пространство, которое в свою очередь тоже поднимает другие пространства, то весь суммарный набор определений из этих пространств оказываются поднятыми на текущий уровень. Листинг 24.16 демонстрирует небольшой пример такой возможности.

#include <iostream.h>

#include <cstring.h>

namespace A {

int a = 123;

)

namespace В {

long b •- 456L;

}

namespace С {

string с = "Здравствуй, мир!'

using namespace A;

using namespace B;