Стандартное пространство имен std
Все компоненты стандартной библиотеки С++ находятся в пространстве имен std. Каждая функция, объект и шаблон класса, объявленные в стандартном заголовочном файле, таком, как <vector> или <iostream>, принадлежат к этому пространству.
Если все компоненты библиотеки объявлены в std, то какая ошибка допущена в данном примере:
#include <vector> #include <string> #include <iterator> int main() { // привязка istream_iterator к стандартному вводу istream_iterator<string> infile( cin ); // istream_iterator, отмечающий end-of-stream istream_iterator<string> eos; // инициализация svec элементами, считываемыми из cin vector<string> svec( infile, eos ); // ... |
}
Правильно, этот фрагмент кода не компилируется, потому что члены пространства имен std
должны использоваться с указанием их специфицированных имен. Для того чтобы исправить положение, мы можем выбрать один из следующих способов:
· заменить имена членов пространства std в этом примере соответствующими специфицированными именами;
· применить using-объявления, чтобы сделать видимыми используемые члены пространства std;
· употребить using-директиву, сделав видимыми все члены пространства std.
Членами пространства имен std в этом примере являются: шаблон класса istream_iterator, стандартный входной поток cin, класс string и шаблон класса vector.
Простейшее решение – добавить using-директиву после директивы препроцессора #include:
using namespace std;
В данном примере using-директива делает все члены пространства std
видимыми. Однако не все они нам нужны. Предпочтительнее пользоваться using-объявлениями, чтобы уменьшить вероятность коллизии имен при последующем добавлении в программу глобальных объявлений.
Using-объявления, необходимые для компиляции этого примера, таковы:
using std::istream_iterator; using std::string; using std::cin; |
Но куда их поместить? Если программа состоит из большого количества файлов, можно для удобства создать заголовочный файл, содержащий все эти using-объявления, и включать его в исходные файлы вслед за заголовочными файлами стандартной библиотеки.
В нашей книге мы не употребляли using-объявлений. Это сделано, во-первых, для того, чтобы сократить размер кода, а во-вторых, потому, что большинство примеров компилировались в реализации С++, не поддерживающей пространства имен. Подразумевается, что using-объявления указаны для всех членов пространства имен std, используемых в примерах.
Упражнение 8.14
Поясните разницу между using-объявлениями и using-директивами.
Упражнение 8.15
Напишите все необходимые using-объявления для примера из раздела 6.14.
Упражнение 8.16
Возьмем следующий фрагмент кода:
namespace Exercise { int ivar = 0; double dvar = 0; const int limit = 1000; } int ivar = 0; //1 void manip() { //2 double dvar = 3.1416; int iobj = limit + 1; ++ivar; ++::ivar; |
Каковы будут значения объявлений и выражений, если поместить using-объявления для всех членов пространства имен Exercise в точку //1? В точку //2? А если вместо using-объявлений использовать using-директиву?
9