684_______________________________Часть IV. Новые возможности C++
чтобы принимать аргумент float, и эту версию функции он и пытался вызвать.
Test::JustAFunc(24.7) ;
К сожалению, к этому моменту компилятору известна только целочисленная версия. В C++ величины с плавающей точкой могут быть преобразованы в целые в момент вызова функций. Именно это и происходит — вызывается целочисленная версия с целочисленным аргументом 24. Такую ошибку действительно очень трудно отследить.
Вывод: при разбиении пространств имен следует быть очень внимательным, особенно, если при этом используется перегрузка функций.
Безымянные пространства имен
Достаточно удивительным является тот факт, что имя пространства, которое, как было показано, есть нечто большее, чем просто поименованная область видимости, является необязательным. Что это значит?
Все неименованные (также называемые анонимными) пространства, которые не вложены внутрь других пространств, могут использоваться одновременно. Поскольку у них нет имени, по которому можно строить уточняющий префикс, такие пространства имеют глобальную область видимости. Рассмотрим листинг 24.11.
ftinclude <iostream.h>
namespace (
int i = 10;
int z = 5;
}
int i --- 1;
void main i)
z++;
cout « z « endl;
Здесь имеется два определения i, и оба на глобальном уровне видимости. Важно отметить, что это два различных определения i: как бы странно это ни казалось, они ссылаются на различные переменные. Следовательно, компилятор не воспримет их как ошибку дублирования имен. Если, однако,