Они реализуют спецификацию C ++ 0x, где Base
- это текущее значение .И C ++ 0x позволяет опустить ключевое слово template
в таком случае.Так как BaseType
является typedef для Base
, когда вы говорите BaseType
, это также указывает на текущую реализацию.
Чтобы процитировать спецификацию, поскольку вас, похоже, интересуют спецификации, ссылки
Имя является членом текущей реализации , если оно является [...]
- Квалифицированный идентификатор, в котором спецификатор вложенного имени ссылается на текущий экземпляр , а при поиске ссылается как минимум на один член текущегоэкземпляр или независимый базовый класс.
и
Имя относится к текущему экземпляру , если оно [...]
- в определении [...] вложенного класса шаблона класса, [...], имя введенного класса (раздел 9) классашаблон или вложенный класс
и (указанный вами измененный 14.2 / 4)
[...] или спецификатор вложенного имени вквалифицированный идентификатор относится к зависимому типу, но имя не является членом текущего экземпляра (14.6.2.1), имя шаблона элемента должно начинаться с префикса ключевого слова template.[...]
Примечание. В C ++ 03 ваш код некорректен, поскольку оба BaseType
и OtherType
являются зависимыми.Спецификация гласит:
Тип зависит, если он [...]
- параметр шаблона
- квалифицированный идентификатор с вложеннымспецификатор-имени, который содержит имя-класса, которое именует зависимый тип
- идентификатор шаблона, в котором либо имя шаблона является параметром шаблона, либо любой из аргументов шаблона является зависимым типом
(обратите внимание, что Base
эквивалентно Base<T>
, который является основой, на которой Base
и BaseType::InnerA
являются зависимыми типами).
Обратите внимание, что выражение "явно зависит" в вашей цитате - это предстандартный термин, от которого довольно недавно избавились (полагаю, это было в декабре 1996 года).В основном это означало (в этом контексте) квалифицированный идентификатор, в котором спецификатор является зависимым, или доступ к члену класса (a->x
/ a.x
), где a
был зависимым.После того, как «явная зависимость» была удалена из черновика, в некоторых местах она все еще скрывалась, и даже в C ++ 0x все еще есть ссылки на «явную зависимость» в примечании в 14.6.2p2:
имя базового класса B<T>
, имя типа T::A
, имена B<T>::i
и pb->j
явно зависят от параметра-шаблона.