Глава 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 () была перегружена так,