Что мне в имени этом?..

Представим, что вы получили задание организовать ежегодный банкет вашего отдела. Приглашены почти 50 человек, и вы уверены, что все идет как надо. Однако за день до торжества вы получаете записку от вашего шефа, в которой сообщается следующее: "Вот план расположения гостей за столом на завтрашнем банкете. Нельзя допустить, чтобы определенные гости оказались рядом. Некоторые из сотрудников становятся слишком болтливыми в нетрезвом виде и могут преждевременно раскрыть детали будущей реорганизации отдела".

Перед началом банкета, после расстановки столов вы достаете план и начинаете раскладывать карточки с именами гостей. И тут вы с ужасом обнаруживаете, что в плане указаны только имена. В вашем отделе четыре Джима, три Мэри, два Джона и добрая дюжина Крисов.

Конечно, вы в последний момент попытались хоть навести какой-то порядок, но без особого успеха. И вот уже к середине вечера негодующий Джон льет шампанское на голову Джима. Шеф окружен десятком ведущих программистов, требующих от него ответа, почему их собираются пересаживать в другие комнаты и заставляют переключаться на программирование по технологии OLE. А один из Крисов почти рыдает, случайно узнав от Мэри, что его переводят на Аляску в новый офис фирмы для программирования автоматики зернохранилищ.

Придя на работу на следующее утро, вы обнаруживаете ваши вещи в картонной коробке перед входом.

Очевидно, что существует достаточно ситуаций, в которых правильное имя имеет жизненно важное значение. Это в особенности справедливо для программ на C++, в которых объекты, функции, методы определяются с помощью имен. Если в программе две конструкции имеют одинаковые имена, это называется конфликтом имен (name clash) и, как мы увидим в дальнейшем, многие досадные проблемы, вызываемые такими конфликтами, могут быть сняты с помощью такого средства языка, как пространства имен.

Конфликты имен

Если предыдущая история показалась вам далекой от реальных проблем программирования на C++, попытаемся взглянуть на нее с другой стороны. Довольно часто встречаются ситуации, в которых программист хотел бы использовать некоторые классы, но не может этого сделать из-за конфликта имен. До появления возможностей пространств имен такие конфликты могли вынудить программиста отказаться от использования определенной библиотеки классов или даже заняться разработкой собственной библиотеки.

Источник проблемы кроется в том, что для обычного C++, не структурированного в пространстве имен, существует единый глобальный уровень ви-