Глава 24. Пространства имен 683

! / Здесь пространство расширяется

namespace Test

{

//А это перегруженная версия JustAFunc

void JustAFunc(float AFloat)

{

cout « "Это float! (Значение = " « AFloat « ")\n";

} }

void main() i '

InterestingFunc();

)

Вместо ожидаемого Это float.., программа выдает сообщение это int... и усеченное значение. В чем причина?

Очень важно иметь в виду, что компилятор Borland не компилирует все объявления для данного пространства, пока не просмотрит весь код до конца. Как и вся программа, пространства имен обрабатываются слева направо сверху вниз. Это означает, что код, находящийся между двумя объявлениями одного и того же пространства, может использовать только те элементы, которые были объявлены в первом фрагменте пространства. В противном случае необходимо было бы иметь способ сообщить компилятору, что после обработки двух объявлений пространств он должен возвратиться назад.

В принципе, нарушение этого правила в программах достаточно безопасно:

если в точке между двумя объявлениями пространств имен происходит попытка использования объявленных ниже элементов, то компилятор сообщает, что не может найти объявления указанных элементов и программист исправляет ошибку. Однако при наличии перегрузки функций ситуация усложняется.

Вернемся к листингу 24.10. Первое объявление пространства имен Test содержит версию JustAFunc (), которая имеет один аргумент типа int.

//Первоначальное объявление пространства

namespace Test

(

void JustAFunc(int Anint)

{

cout « "Это int! (Значение = " « Anint « ")\n";

} }

Определение функции InterestingFunc () находится в промежутке между двумя объявлениями пространства Test; здесь и кроется причина затруднений. Профаммист знает, что функция JustAFunc () была перегружена так,