#c #language-lawyer #c 20
Вопрос:
Рассмотрим следующий пример [temp.dep.type] p3
template<class T> struct A {
typedef int M;
struct B {
typedef void M;
struct C;
};
};
template<class T> struct A<T>::B::C : A<T> {
M m; // OK, A<T>::M
};
Пример подразумевает, что A является текущим классом создания экземпляра в определении A::B::C. Однако в соответствии с [temp.dep.тип#1.2]
Имя или идентификатор шаблона относится к текущему экземпляру, если он
- […]
- в определении шаблона основного класса или члена шаблона основного класса имя шаблона класса, за которым следует список аргументов шаблона его заголовка шаблона ([temp.arg]), заключенный в <> (или эквивалентная специализация псевдонима шаблона),
- […]
В этом примере шаблон основного класса A
означает, что класс-член C
вложенного класса B
является членом шаблона класса A
?
Комментарии:
1. Ваша цитата в основном относится к введенному имени класса, которое вы не используете (
A::M
использовали бы введенное имя класса). непонятный для меня вопрос. A не имеетint m;
;C::M
может быть толькоA::M
(через наследование).B::M
это просто сбивает с толку.2. @Jarod42 Цитата, которую я привел, касается именно идентификатора шаблона , который может указывать на текущий экземпляр.