Поделиться через


Шаблоны и разрешение имен

В определениях шаблонов существует три типа имен:

  • локально объявленные имена, включая имя самого шаблона, и все имена, объявленные в рамках определения шаблона;

  • имена из внешней области видимости вне определения шаблона;

  • имена, зависящие каким-либо образом от аргументов шаблона (называемые зависимыми именами).

Хотя первые два типа имен также относятся к областям видимости класса и функции, в определениях шаблонов необходимо иметь особые правила разрешения имен для устранения проблем, связанных с дополнительной сложностью зависимых имен. Причина этого в том, что до создания экземпляра шаблона компилятор мало знает об этих именах, поскольку они могут быть совершенно разных типов в зависимости от используемых аргументов шаблона. Поиск независимых имен осуществляется в соответствии с обычными правилами и в точке определения шаблона. Эти имена, не зависящие от аргументов шаблона, ищутся один раз для всех специализаций шаблона. Поиск зависимых имен не выполняется, пока не будет создан экземпляр шаблона, и такие имена ищутся отдельно для каждой специализации.

Тип является зависимым, если он зависит от аргументов шаблона. В частности, он зависим, если представляет собой:

  • аргумент шаблона:

    T
    
  • полное имя с квалификацией, включающей зависимый тип:

    T::myType
    
  • полное имя, если неопределенная часть идентифицирует зависимый тип:

    N::T
    
  • тип const или volatile, для которого базовый тип является зависимым:

    const T
    
  • тип указателя, ссылки, массива или указателя функции в зависимости от зависимого типа:

    T *, T &, T [10], T (*)()
    
  • массив, размер которого зависит от параметра шаблона:

    template <int arg> class X {
    int x[arg] ; // dependent type
    }
    
  • тип шаблона, созданного из параметра шаблона:

    T<int>, MyTemplate<T>
    

Зависимость от типа и зависимость от значения

Имена и выражения, зависящие от параметра шаблона, классифицируются как зависящие от типа или значения в зависимости от того, является ли параметр шаблона параметром типа или параметром значения. Кроме того, все идентификаторы, объявленные в шаблоне с типом, зависящим от аргумента шаблона, считаются зависимыми от значения, так как это целочисленный или тип перечисления, инициализированный с выражением, зависящим от значений.

Выражения, зависящие от типа, и выражения, зависящие от значения, — это выражения, содержащие переменные, зависящие от типа или значения. Эти выражения могут иметь семантику, зависящую от параметров, используемых для шаблона.

См. также

Шаблоны