C ++ Builder здесь не так. Причина, по которой вы должны иметь возможность использовать имя предка в списке инициализатора члена конструктора, связана с концепцией введенного имени класса .
Когда вы определяете класс, компилятор вставляет имя класса в этот класс и заставляет его ссылаться на себя. Это внедренное имя позволяет вам использовать имя класса без аргументов шаблона внутри класса.
template <class T>
struct tt {
// The compiler behaves as if there was the following.
// typedef tt<T> tt;
};
Это введенное имя - то, что ищется, когда вы используете имя tt
в списке инициализатора члена.
(Для записи clang принимает фрагмент без аргумента шаблона.)
Бонус: если бы вы определили cc
как шаблон класса с параметром шаблона T
и предок зависел от T
, имя tt
не будет найдено в контексте из списка инициализаторов элементов cc
.
template <class T>
class cc : tt<T> {
cc()
: tt<T>() /* You must use <T> here. */
{
}
};