Читайте также: |
|
Используйте это ключевое слово только в определениях шаблонов.
Это ключевое слово следует использовать, если имя является квалифицированным и зависящим от аргумента шаблона; оно не обязательно, если квалифицированное имя от аргументов шаблона не зависит.
Доп. Инфо:
В определениях шаблонов существует три типа имен:
· локально объявленные имена, включая имя самого шаблона, и все имена, объявленные в рамках определения шаблона;
· имена из внешней области видимости вне определения шаблона;
· Имена, которые зависят каким-либо образом от аргументов шаблона, называются "зависимые имена".
Хотя первые два типа имен также относятся к областям видимости класса и функции, в определениях шаблонов необходимо иметь особые правила разрешения имен для устранения проблем, связанных с дополнительной сложностью зависимых имен. Причина этого в том, что до создания экземпляра шаблона компилятор мало знает об этих именах, поскольку они могут быть совершенно разных типов в зависимости от используемых аргументов шаблона. Поиск независимых имен осуществляется в соответствии с обычными правилами и в точке определения шаблона. Эти имена, не зависящие от аргументов шаблона, ищутся один раз для всех специализаций шаблона. Поиск зависимых имен не выполняется, пока не будет создан экземпляр шаблона, и такие имена ищутся отдельно для каждой специализации.
Тип является зависимым, если он зависит от аргументов шаблона. В частности, он зависим, если представляет собой:
· аргумент шаблона: 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>
Зависимость от типа и зависимость от значения
Имена и выражения, зависящие от параметра шаблона, классифицируются как зависящие от типа или значения в зависимости от того, является ли параметр шаблона параметром типа или параметром значения. Кроме того, все идентификаторы, объявленные в шаблоне с типом, зависящим от аргумента шаблона, считаются зависимыми от значения, так как имеют целочисленный тип или тип перечисления, инициализированный выражением, зависящим от значения.
Выражения, зависящие от типа, и выражения, зависящие от значения, — это выражения, содержащие переменные, зависящие от типа или значения. Эти выражения могут иметь семантику, зависящую от параметров, используемых для шаблона. (конец Доп. Инфо.)
typename может использоваться любым типом в любом месте объявления или определения шаблона. Он не допускается в списке базовых классов, если только не является аргументом шаблона к шаблонному базовому классу.
template <class T>
class C1: typename T::InnerType // Error - typename not allowed.
{};
template <class T>
class C2: A<typename T::InnerType> // typename OK.
{};
Ключевое слово typename также можно использовать вместо class в списках параметров шаблона. Например, указанные ниже операторы идентичны.
template<class T1, class T2>...
template<typename T1, typename T2>...
Пример
// typename.cpp
template<class T> class X
{
typename T::Y m_y; // treat Y as a type
};
int main()
{
}
P.S. Это общая информация про данное ключевое слово. http://alenacpp.blogspot.com/2006/08/typename.html
https://rsdn.ru/forum/cpp/1144745.all
здесь можно найти еще немного инфы и примеров.
Не добавляла в текст ответа потому, что информация с форума.
Дата добавления: 2015-09-03; просмотров: 68 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Схемы отображения шрифтов | | | Недостатки шаблонов |