Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Заметки

Читайте также:
  1. Глава. Заметки в Библии
  2. ЗАМЕТКИ БРЮССЕЛЬСКИХ РЕДАКТОРОВ
  3. ЗАМЕТКИ О ПСИХОЛОГИИ СЕКСУАЛЬНОСТИ
  4. Заметки о рассеянности, осуждении и необходимом смирении
  5. ЗАМЕТКИ О ШЕКСПИРЕ
  6. Заметки экономиста: К началу нового хозяйственного года

Используйте это ключевое слово только в определениях шаблонов.

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

Доп. Инфо:

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

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

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

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

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

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

· аргумент шаблона: 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 | Нарушение авторских прав


Читайте в этой же книге: Полиморфизм и виртуальные функции. Применение динамического полиморфизма. Виртуальные деструкторы. Абстрактные классы и чисто виртуальные функции. | Длина самого длинного слова 10 | Самое длинное слово beautiful | Строковые потоки | Состояние формата (ОТНОСИТСЯ К ПОСЛЕДНЕМУ ВОПРОСУ, КОТОРЫЙ 24) | Работа с несовместимыми конструкциями. | Стандартный класс string. Зарезервированные слова и опции меню. | Стандартный класс string. Операции ввода-вывода строк. | Описание таблицы акселераторов | Специализация шаблонов класса |
<== предыдущая страница | следующая страница ==>
Схемы отображения шрифтов| Недостатки шаблонов

mybiblioteka.su - 2015-2024 год. (0.011 сек.)