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


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

В определении шаблона, 3 типа имен.

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

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

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

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

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

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

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

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

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

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

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

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

    T<int>, MyTemplate<T>
    

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

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

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

См. также

Другие ресурсы

Шаблоны