Этот код в порядке.Внутри Derived
класс Base
будет ссылаться на Base<int>
, , потому что Derived
наследуется от Base<int>
.Да, это законно.
Стандарт:
14.6.1.1: Как и обычные (не шаблонные) классы, шаблоны классов имеют имя введенного класса (раздел 9).Введенное имя класса может использоваться как имя шаблона или имя типа.Когда он используется со списком аргументов шаблона, в качестве аргумента шаблона для параметра шаблона или в качестве окончательного идентификатора в подробном спецификаторе типа объявления шаблона класса друга, он ссылается на сам шаблон класса.,В противном случае оно эквивалентно имени шаблона, за которым следуют параметры шаблона шаблона класса, заключенного в <>.
Также:
3.4.3:injected-class-name класса (раздел 9) также считается членом этого класса для целей сокрытия и поиска имени.
Последнее предложение делает это.Вкратце A<B>
вводит скрытый «псевдоним» A = A<B>
, но только если A
используется без <>
.В примере он представлен в базовом классе, а производный класс наследует всех членов базового класса.