Выбор ответа Senior Шаблоны и концепты обновлено

Член зависимой базы

Вопрос

template <class T> struct D : Base<T> { void g() { helper(); } }; не компилируется, хотя helper объявлен в Base<T>. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Имена из зависимой базы не ищутся: нужно this-helper(). Двухфазный поиск: неквалифицированное имя helper ищется при разборе шаблона, а базовый класс Base<T зависит от T и может быть специализирован как угодно, поэтому в него не заглядывают. this- делает имя зависимым, и поиск откладывается до…

Варианты ответа

  1. Наследоваться от шаблона класса нельзя, только от его инстанцирования
  2. Имена из зависимой базы не ищутся: нужно this->helper()правильный ответ
  3. Нужно объявить helper виртуальной, иначе её не видно в D
  4. Нужно добавить typename перед вызовом, так как имя зависимое

Разбор

Двухфазный поиск: неквалифицированное имя helper ищется при разборе шаблона, а базовый класс Base<T> зависит от T и может быть специализирован как угодно, поэтому в него не заглядывают. this-> делает имя зависимым, и поиск откладывается до инстанцирования.

  • Наследоваться от шаблона можно.
  • Виртуальность не влияет на поиск имён.
  • typename нужен для зависимых типов, а не для вызова функции.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.