Язык программирования C++. Вводный курс

Определение члена пространства имен


Мы видели, что определение члена пространства имен может появиться внутри определения самого пространства. Например, класс matrix и константа pi

появляются внутри вложенного пространства имен MatrixLib, а определения функций operator+() и inverse()

приводятся где-то в другом месте текста программы:

// ---- primer.h ----

namespace cplusplus_primer {

    // первое вложенное пространство имен:

    // матричная часть библиотеки

    namespace MatrixLib {

        class matrix { /* ... */ };

        const double pi = 3.1416;



        matrix operators+ ( const matrix &ml, const matrix &m2 );

        void inverse( matrix & );

        // ...

    }

}

Член пространства имен можно определить и вне соответствующего пространства. В таком случае имя члена должно быть квалифицировано именами пространств, к которым он принадлежит. Например, если определение функции operator+()

помещено в глобальную область видимости, то оно должно выглядеть следующим образом:

// ---- primer.C ----

#include "primer.h"

// определение в глобальной области видимости

cplusplus_primer::MatrixLib::matrix

    cplusplus_primer::MatrixLib::operator+

       ( const matrix& ml, const matrix &m2 )

           { /* ... */ }

Имя operator+()

квалифицировано в данном случае именами пространств cplusplus_primer и Ma­trixLib.

Однако обратите внимание на тип matrix в списке параметров operator+(): употреблено неквалифицированное имя. Как такое может быть?

В определении функции operator+()

можно использовать неквалифицированные имена для членов своего пространства, поскольку определение принадлежит к его области видимости. При разрешении имен внутри функции operator+()

используется MatrixLib. Заметим, однако, что в типе возвращаемого значения все же нужно указывать квалифицированное имя, поскольку он расположен вне области видимости, заданной определением функции:

cplusplus_primer::MatrixLib::operator+

В определении operator+()

неквалифицированные имена могут встречаться в любом объявлении или выражении внутри списка параметров или тела функции. Например, локальное объявление внутри operator+()


способно создать объект класса matrix:



// ---- primer.C ----

#include "primer.h"

cplusplus_primer::MatrixLib::matrix

    cplusplus_primer::MatrixLib::operator+

        ( const matrix &ml, const matrix &m2 )

    {

        // объявление локальной переменной типа

        // cplusplus_primer::MatrixLib::matrix

        matrix res;

        // вычислим сумму двух объектов matrix

        return res;
    }

Хотя члены могут быть определены вне своего пространства имен, такие определения допустимы не в любом месте. Их разрешается помещать только в пространства, объемлющие данное. Например, определение operator+() может появиться в глобальной области видимости, в пространстве имен cplusplus_primer и в пространстве Ma­trixLib. В последнем случае это выглядит так:



// ---- primer.C --

#include "primer.h"

namespace cplusplus_primer {

    MatrixLib::matrix MatrixLib::operator+

        ( const matrix &ml, const matrix &m2 ) { /* ... */ }
}

Член может определяться вне своего пространства только при условии, что ранее он был объявлен внутри. Последнее приведенное определение operator+()

было бы ошибочным, если бы ему не предшествовало объявление в файле primer.h:



namespace cplusplus_primer {

    namespace MatrixLib {

        class matrix { /*...*/ };

        // следующее объявление не может быть пропущено

        matrix operator+ ( const matrix &ml, const matrix &m2 );

        // ...

    }
}


Содержание раздела