Ничего особенного на самом деле.C ++ позволяет вам ссылаться на класс через разработанный спецификатор типа .Например,
void foo(class bar*);
. Здесь объявляется функция foo
, которая принимает аргумент типа bar*
.Если bar
не было объявлено ранее, этот сложный спецификатор типа представляет собой объявление bar
в пространстве имен, содержащем foo
.Т.е. как если бы вы написали:
class bar;
void foo(bar*);
Возвращаясь к вашему примеру, X
- это шаблон класса, который ожидает один параметр типа, обозначенный class T
, но мог бы быть обозначен так же, какtypename T
.Указанный параметр типа имеет аргумент по умолчанию, названный разработанным спецификатором класса class Z
.Это объявление может быть переписано так же, как функция выше:
class Z;
template<class T = Z>
struct X
{};