Шаблоны и разрешение имен
В определении шаблона, 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>
Зависимость от типа и зависимость от значения
Имена и выражения, зависящие от параметре шаблона, входят в категорию зависимые типа или зависимые значения в зависимости от того, является ли параметр шаблона или параметр типа параметра значения.Кроме того, все идентификаторы, объявленные в шаблоне с зависимой ячейкой типа в аргументе шаблона считаются зависимой ячейкой значения, например интеграл или тип перечисления, инициализированный с выражением значение-зависимой ячейки.
Выражения Тип-зависимой ячейки и ячейки значение-зависимой выражения, включающие переменные, зависимые от типа или значения.Эти выражения могут содержать семантику, различаются в зависимости от параметров, используемых для шаблона.