Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 225

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Подобно статичСским Ρ‡Π»Π΅Π½Π°ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ класса, ΠΊ статичСскому Ρ‡Π»Π΅Π½Ρƒ шаблона класса ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ΠΈΠ»ΠΈ нСпосрСдствСнно, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° области видимости. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСский Ρ‡Π»Π΅Π½ Ρ‡Π΅Ρ€Π΅Π· класс, слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ экзСмпляру:

Foo<int> fi;                 // создаСт экзСмпляр класса Foo<int>

                             // ΠΈ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° ctr

auto ct = Foo<int>::count(); // создаСт экзСмпляр Foo<int>::count()

ct = fi.count();             // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Foo<int>::count()

ct = Foo::count();           // ошибка: экзСмпляр ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ

                             // шаблона создаСтся?

Как ΠΈ любая другая функция-Ρ‡Π»Π΅Π½, экзСмпляр статичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π΅Π³ΠΎ использовании Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 16.1.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.9. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ шаблон Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ шаблон класса?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.10. Π§Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ создании экзСмпляра шаблона класса?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.11. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона List Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Как Π΅Π³ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ?

template <typename elemType> class ListItem;

template <typename elemType> class List {

public:

 List<elemType>();

 List<elemType>(const List<elemType> &);

 List<elemType>& operator=(const List<elemType> &);

 ~List();

 void insert(ListItem *ptr, elemType value);

private:

 ListItem *front, *end;

};

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.12. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ собствСнныС вСрсии шаблонов Blob ΠΈ BlobPtr, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС константныС Ρ‡Π»Π΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ прСдставлСны Π² тСкстС.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.13. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ друТСствСнных ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π²Ρ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Π±Ρ‹ для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² равСнства ΠΈ сравнСния шаблона BlobPtr.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.14. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ шаблон класса Screen, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ значСния для опрСдСлСния высоты ΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ экрана.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.15. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° для своСго шаблона Screen. КакиС Π΄Ρ€ΡƒΠ·ΡŒΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ классу Screen (Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°? ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ объявлСниС друТСствСнным (Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.16. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ класс StrVec (см. Ρ€Π°Π·Π΄Π΅Π» 13.5), ΠΊΠ°ΠΊ шаблон Vec.

16.1.3. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона

Подобно ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ имя Π’, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅:

template <typename Foo> Foo calc(const Foo& a, const Foo& b) {

 Foo tmp = a; // Ρ‚ΠΈΠΏ tmp совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ

              // значСния

 // ...

 return tmp; // Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚

}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ области видимости. Имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ сразу послС Π΅Π³ΠΎ объявлСния ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° объявлСния ΠΈΠ»ΠΈ опрСдСлСния шаблона. Подобно Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона скрываСт Π»ΡŽΠ±Ρ‹Π΅ объявлСния ΠΈΠΌΠ΅Π½ Π²ΠΎ внСшнСй области видимости. Однако, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… контСкстов, имя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ использовано Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… шаблона:

typedef double А;

template <typename A, typename Π’> void f(А Π°, Π’ b) {

 A tmp = Π°; // tmp ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона А, Π° Π½Π΅ double

 double Π’;  // ошибка: ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ объявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона Π’

}

Богласно ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ сокрытия ΠΈΠΌΠ΅Π½, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ typedef Ρ‚ΠΈΠΏΠ° А скрываСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ А. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, пСрСмСнная tmp Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ double; ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ шаблона А ΠΏΡ€ΠΈ использовании шаблона. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона, объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ B ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹:

// ошибка: ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ V Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… шаблона нСдопустимо

template <typename V, typename V> // ...

ОбъявлСния шаблона

ОбъявлСниС шаблона Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона:

// ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚, Π½ΠΎ Π½Π΅ опрСдСляСт compare ΠΈ Blob

template <typename Π’> int compare(const T&, const T&);

template <typename T> class Blob;

Подобно ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΈ опрСдСлСниях Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ шаблона:

// всС Ρ‚Ρ€ΠΈ случая использования calc

// ΠΎΡ‚носятся ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

template <typename В> В calc(const В&, const В&); // объявлСниС

template <typename U> U calc(const U&, const U&); // объявлСниС

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона

template <typename Type>

Type calc(const Type& a, const Type& b) { /* ... */ }

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ объявлСния ΠΈ опрСдСлСния шаблона Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ количСство ΠΈ Π²ΠΈΠ΄ (Ρ‚.Π΅. Ρ‚ΠΈΠΏ ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

По ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, рассматриваСмым Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 16.3, объявлСния всСх шаблонов, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ вмСстС Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠΌ.

ИспользованиС Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ°

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 7.4 ΠΈ 7.6 использовался ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости (::) для обращСния ΠΊ статичСским Ρ‡Π»Π΅Π½Π°ΠΌ ΠΈ Ρ‡Π»Π΅Π½Π°ΠΌ Ρ‚ΠΈΠΏΠ°. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ (Π½Π΅ шаблона) Ρƒ компилятора Π΅ΡΡ‚ΡŒ доступ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ класса. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ½ Π·Π½Π°Π΅Ρ‚, являСтся Π»ΠΈ имя, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости, Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ статичСским Ρ‡Π»Π΅Π½ΠΎΠΌ. НапримСр, Π² ΠΊΠΎΠ΄Π΅ string::size_type, компилятор ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса string ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ size_type β€” это Ρ‚ΠΈΠΏ.

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π’ являСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° шаблона, ΠΊΠΎΠ³Π΄Π° компилятор встрСтит Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ T::mem, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ Π΄ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ создания экзСмпляра, являСтся Π»ΠΈ mem Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½ΠΎΠΌ. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ шаблон, компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ, прСдставляСт Π»ΠΈ имя Ρ‚ΠΈΠΏ. НапримСр, Ссли T являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ ΠΊΠ°ΠΊ компилятор воспримСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

T::size_type * p;

Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ, опрСдСляСтся Π»ΠΈ пСрСмСнная ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ p ΠΈΠ»ΠΈ происходит ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ size_type Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ p.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ язык ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ имя, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости, Π½Π΅ являСтся Ρ‚ΠΈΠΏΠΎΠΌ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ-Ρ‡Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° шаблона, слСдуСт явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ имя являСтся Ρ‚ΠΈΠΏΠΎΠΌ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename:

template <typename Π’>

typename В::value_type top(const T& с) {

 if (!c.empty())

  return c.back();

 else

  return typename T::value_type();

}

Ѐункция top() ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename для опрСдСлСния своСго Ρ‚ΠΈΠΏΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΈ создаСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ элСмСнт (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.3), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ссли Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… элСмСнтов.

Когда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ компилятор ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ имя прСдставляСт Ρ‚ΠΈΠΏ, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename, Π° Π½Π΅ class.

АргумСнты шаблона ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Аналогично Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 6.5.1), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ шаблона ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (default template argument). По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ для шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ для шаблонов классов. ΠŸΡ€Π΅ΠΆΠ½ΠΈΠ΅ вСрсии языка допускали Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для шаблонов класса.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ less (см. Ρ€Π°Π·Π΄Π΅Π» 14.8.2):

// compare() ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ шаблона ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, less<T>

// ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, F()

template <typename Π’, typename F = less<T>>

int compare(const T &v1, const T &v2, F f = F()) {

 if (f(v1, v2)) return -1;

 if (f(v2, v1)) return 1;

 return 0;

}

Π—Π΄Π΅ΡΡŒ Π² шаблон Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°, F, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (см. Ρ€Π°Π·Π΄Π΅Π» 10.3.2), ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, f, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ связан с Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.