680 __ _______ _______i______Часть IV. Новые возможности C++
// Ошибка — Inner недоступна в main() // Inner::AFunc();
// Правильно Outer::Inner::AFunc();
}
Первая попытка использования функции Outer:: AFunc () ошибочна, поскольку AFunc () не видна в пространстве Outer. Напомним, что если в inner доступно все, что определено, в Outer, само пространство Outer ничего не знает о том, что происходит в inner.
Вторая попытка использования функции inner:: AFunc о ошибочна по той же причине. Хотя функция inner:: AFunc о действительно существует, непосредственно из main () она недоступна. Поскольку пространство inner вложено в outer, нужно сначала подняться на промежуточный уровень outer. Заметим, однако, что вызов inner:: AFunc () из точки кода внутри пространства Outer является правильной формой вызова.
Правильный способ вызова AFunc о из main() состоит в том,'чтобы пройти по всей цепочке, начиная с самого внутреннего уровня области видимости и вплоть до нужного уровня.
Замечание
Хотя объявление пространства имен выглядит аналогично объявлению класса, в действительности — это разные конструкции, предназначенные для совершенно различных целей. Одно из существенных различий, которое следует отметить — это отсутствие средств контроля доступа. Поскольку пространства не могут закрывать или защищать части своих определений (подобно секциям классов private или protected), то указания имени пространства достаточно, чтобы получить доступ ко всем его определениям.
Расширение пространств имен
Пространства имен обладают многими интересными и необычными свойствами, среди которых есть и возможность их достраивать. Это означает, что в программе можно определить пространство с начальным набором определений, а затем дополнить этот набор позже в другом месте программы. Начнем рассмотрение этого свойства с примера из листинга 24.8.
^include <iostream.h>
//' Первоначальное объявление пространства имен
namespace Test
(
void JustAFunc() { cout « " Предупреждение!\n"; }