Выбор ответа Senior Шаблоны и концепты обновлено
Член зависимой базы
Вопрос
template <class T> struct D : Base<T> { void g() { helper(); } }; не компилируется, хотя helper объявлен в Base<T>. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Имена из зависимой базы не ищутся: нужно this-helper(). Двухфазный поиск: неквалифицированное имя helper ищется при разборе шаблона, а базовый класс Base<T зависит от T и может быть специализирован как угодно, поэтому в него не заглядывают. this- делает имя зависимым, и поиск откладывается до…
Варианты ответа
- Наследоваться от шаблона класса нельзя, только от его инстанцирования
- Имена из зависимой базы не ищутся: нужно
this->helper()правильный ответ - Нужно объявить
helperвиртуальной, иначе её не видно вD - Нужно добавить
typenameперед вызовом, так как имя зависимое
Разбор
Двухфазный поиск: неквалифицированное имя helper ищется при разборе шаблона, а базовый класс Base<T> зависит от T и может быть специализирован как угодно, поэтому в него не заглядывают. this-> делает имя зависимым, и поиск откладывается до инстанцирования.
- Наследоваться от шаблона можно.
- Виртуальность не влияет на поиск имён.
typenameнужен для зависимых типов, а не для вызова функции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Шаблоны и концепты»
- Дерево отрезков с операцией как параметром шаблона
- Обобщённая функция статистики для чисел и строк
- Один бинарный поиск на все случаи: предикат как параметр шаблона
- Зачем концепты
- Концепты против SFINAE
- Вывод аргументов шаблона класса
- Fold-выражения
- Как компилируются шаблоны