T2
- это независимое имя. Независимые имена не будут просматриваться в зависимых базовых классах, таких как A<T>
, что зависит от параметра шаблона T
.
A<T>::T2
, это зависимое имя. Зависимые имена можно искать только во время создания экземпляра, и в это время будет известна точная базовая специализация, которая должна быть изучена.
С другой стороны, когда базовый класс равен A<int>
, код работает, потому что A<int>
является независимым базовым классом, а независимое имя T2
будет найдено в области A<int>
.