Следует заметить, что директивы #include
обычно не помещают в пространство имен. Если попробовать сделать это, то произойдет попытка определения всех имен в этом заголовке как членов окружающего пространства имен. Например, если бы файл Sales_data.h
открыл пространство имен cplusplus_primer
прежде, чем включить заголовок string
, то в программе была бы ошибка, поскольку это привело бы к попытке определить пространство имен std
в пространстве имен cplusplus_primer
.
Если объявления находятся в области видимости, то код в пространстве имен может использовать короткую форму имен, определенных в том же (или вложенном) пространстве имен:
#include "Sales_data.h"
namespace cplusplus_primer { //
//
//
std::istream&
operator>>(std::istream& in, Sales_data& s) { /* ... */}
}
Член пространства имен может быть также определен вне определения пространства имен. Для этого применяется подход, подобный определению членов класса вне его. Объявление пространства имен должно находиться в области видимости, а в определении следует указать пространство имен, которому принадлежит имя.
//
//
cplusplus_primer::Sales_data
cplusplus_primer::operator+(const Sales_data& lhs,
const Sales_data& rhs) {
Sales_data ret(lhs);
// ...
}
Подобно членам класса, определенным вне самого класса, когда встречается полностью определенное имя, оно находится в пределах пространства имен. В пространстве имен cplusplus_primer
можно использовать другие имена членов пространства имен без квалификации. Таким образом, хотя класс Sales_data
является членом пространства имен cplusplus_primer
, для определения параметров его функций можно использовать его имя без квалификации.
Хотя член класса пространства имен может быть определен вне его определения, такие определения должны присутствовать в окружающем пространстве имен. Таким образом, оператор operator+
класса Sales_data
можно определить в пространстве имен cplusplus_primer
или в глобальной области видимости. Но он не может быть определен в несвязанном пространстве имен.
Специализация шаблона должна быть определена в том же пространстве имен, которое содержит первоначальный шаблон (см. раздел 16.5). Подобно любым другим именам пространства имен, пока специализация объявлена в пространстве имен, ее можно определить вне пространства имен:
//
namespace std {
template <> struct hash
}
//
//
template <> struct std::hash
size_t operator()(const Sales_data& s) const {
return hash
hash
hash
}
//
};
Имена, определенные в глобальной области видимости (т.е. имена, объявленные вне любого класса, функции или пространства имен), определяются в
Для обращения к членам глобального пространства имен применяется ::
) (scope operator). Поскольку глобальное пространство имен неявно, у него нет имени.
Форма записи при обращении к члену глобального пространства имен имеет следующий вид.
::
namespace cplusplus_primer {
//