//
//
template
//
friend class Раl3; //
//
};
Чтобы позволить создавать все экземпляры как дружественные, объявление дружественных отношений должно использовать параметры шаблона, которые отличаются от используемых самим классом.
По новому стандарту параметр типа шаблона можно сделать дружественным:
template
friend Type; //
//
// ...
};
Здесь указано, что, независимо от используемого для создания экземпляра типа, класс Bar
будет дружественным. Таким образом, для некоего типа под названием Foo
он был бы другом для Bar
, а тип Sales_data
— другом для Bar
и т.д.
Следует заметить, что хотя другом обычно бывает класс или функция, для класса Bar
вполне допустимо создание экземпляра со встроенным типом. Такие дружественные отношения позволяют создавать экземпляры таких классов, как Bar
со встроенными типами.
Экземпляр шаблона класса определяет тип класса, и, подобно любому другому типу класса, для экземпляра класса можно определить псевдоним при помощи ключевого слова typedef
(см. раздел 2.5.1):
typedef Blob
Это определение типа позволит выполнить код, написанный в разделе 12.1.1, используя текущую версию шаблона Blob
, экземпляр которого создан для типа string
. Поскольку шаблон не тип, ключевое слово typedef
к шаблону неприменимо. Таким образом, нет никакого способа определить typedef
для шаблона Blob<Т>
.
template
twin
где имя twin
определено как синоним для пар с одинаковыми типами членов. Пользователям типа twin
достаточно определить его только однажды.
Псевдоним типа шаблона — это синоним для целого семейства классов:
twin
twin
Как и при использовании шаблона класса, при использовании псевдонима twin
следует указать, какой именно вид twin
необходим.
При определении псевдонима типа шаблона можно зафиксировать один или несколько параметров шаблона:
template
partNo
partNo
partNo
Здесь имя partNo
определено как синоним семейства типов, которые являются парами, вторая переменная-член которого имеет тип unsigned
. Пользователи partNo
определяют тип первой переменной-члена пары, но не второй.
Подобно любому другому классу, шаблон класса способен объявить статические члены (см. раздел 7.6):
template
public:
static std::size_t count() { return ctr; }
//
private:
static std::size_t ctr;
//
};
где Foo
— шаблон класса, у которого есть открытая статическая функция-член count()
и закрытая статическая переменная-член ctr
. У каждого экземпляра шаблона Foo
будет собственный экземпляр статических членов. Таким образом, для любого конкретного типа X
будет по одной переменной Foo
и одной функции Foo
. Все объекты типа Foo
будут совместно использовать ту же переименую ctr
и функцию count()
. Например:
//
//
Foo
//
//
Foo
Подобно любой другой статической переменной-члену, у каждой статической переменной-члена шаблона класса должно быть только одно определение. Однако для каждого экземпляра шаблона класса будет отдельный объект. В результате статическую переменную-член шаблона определяют таким же образом, как и функции-члены этого шаблона:
template
size_t Foo