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

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

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

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ значСния шаблона β€” это константноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ шаблона. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ значСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ константныС выраТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива.

АргумСнты шаблона, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² значСния, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ константными выраТСниями.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ со спСцификаторами inline ΠΈ constexpr

Π¨Π°Π±Π»ΠΎΠ½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн ΠΊΠ°ΠΊ inline (встраиваСмый) ΠΈΠ»ΠΈ constexpr, ΠΊΠ°ΠΊ ΠΈ обычная функция. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ inline ΠΈ constexpr Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ послС списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

// ok: спСцификатор inline слСдуСт Π·Π° списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона

template <typename Π’> inline Π’ min(const Π’&, const Π’&);

// ошибка: Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ спСцификатора inline

inline template <typename T> T min(const T&, const T&);

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, нСзависимого ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°

ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π²Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° создания ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare().

β€’ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² шаблонС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ссылками Π½Π° константу.

β€’ ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π² Ρ‚Π΅Π»Π΅ шаблона слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния <.

ОбъявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ссылками Π½Π° константы Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ копирования. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‚ΠΈΠΏΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ встроСнныС Ρ‚ΠΈΠΏΡ‹, Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ unique_ptr ΠΈ Ρ‚ΠΈΠΏΡ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Но Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ копирования. Π‘Π΄Π΅Π»Π°Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ссылками Π½Π° константы, ΠΌΠΎΠΆΠ½ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли функция compare() Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², такая конструкция ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ копирования ΠΈ сэкономит врСмя ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.

НСкоторыС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для сравнСния Π±Ρ‹Π»ΠΎ Π±Ρ‹ цСлСсообразнСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° < ΠΈ >.

// ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ сравнСниС

if (v1 < v2) return -1;

if (v1 > v2) return 1;

return 0;

Однако написаниС ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <, снизит трСбования ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare(). Π­Ρ‚ΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <, Π½ΠΎ Π½Π΅ обязаны ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >.

ЀактичСски, Ссли Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слСдуСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΈΠΏ less (см. Ρ€Π°Π·Π΄Π΅Π» 14.8.2):

// вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare(), ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π΄Π°ΠΆΠ΅ с

// указатСлями; см. p. 14.8.2

template <typename Π’> int compare(const T &v1, const T &v2) {

 if (less<T>()(v1, v2)) return -1;

 if (less<T>()(v2, v1)) return 1;

 return 0;

}

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ вСрсии Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π΅Π΅ с двумя указатСлями, Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ массив, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ нСпрСдсказуСм.

ΠŸΡ€ΠΈ написании ΠΊΠΎΠ΄Π° шаблонов слСдуСт ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π½Π° Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ шаблона

Когда компилятор встрСчаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона, ΠΎΠ½ Π½Π΅ создаСт ΠΊΠΎΠ΄. Код создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ создании спСцифичСского экзСмпляра шаблона. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ использовании шаблона (Π° Π½Π΅ ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ), влияСт ΠΊΠ°ΠΊ Π½Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ исходного ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΈ Π½Π° способы обнаруТСния ошибок.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, компилятору достаточно объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΈ использовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ доступно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса, Π½ΠΎ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ опрСдСлСния классов ΠΈ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Π° опрСдСлСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² β€” Π² Ρ„Π°ΠΉΠ»Π°Ρ… исходного ΠΊΠΎΠ΄Π°.

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² шаблонов классов ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.

ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ концСпция. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ содСрТат Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΈΠΌΠ΅Π½:

β€’ Π½Π΅ зависящиС ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона;

β€’ Π·Π°Π²ΠΈΡΡΡ‰ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона.

ИмСнно Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ шаблона Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΈΠΌΠ΅Π½Π°, Π½Π΅ зависящиС ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона, Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ использования шаблона. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ шаблона Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ опрСдСлСния шаблона, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ опрСдСлСния Ρ‡Π»Π΅Π½ΠΎΠ² шаблона класса, Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания экзСмпляра шаблона.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ шаблона Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ объявлСний всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΈΠΏΠΎΠ² ΠΈ связанных с Π½ΠΈΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ создании экзСмпляра шаблона.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этих Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Автор шаблона Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит объявлСния всСх ΠΈΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² шаблонС класса ΠΈΠ»ΠΈ Π² опрСдСлСниях Π΅Π³ΠΎ Ρ‡Π»Π΅Π½ΠΎΠ². ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр шаблона для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π»Π΅Π½ класса, созданного ΠΏΠΎ этому ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ для Ρ‚ΠΈΠΏΠ° шаблона ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ.

Ошибки компиляции ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ, Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎ врСмя создания экзСмпляра

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π΅ создаСтся Π΄ΠΎ создания экзСмпляра шаблона, влияСт Π½Π° Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибки компиляции Π² ΠΊΠΎΠ΄Π΅ шаблона. Π’ процСссС создания шаблона Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ этапа, Π²ΠΎ врСмя ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ β€” ΠΊΠΎΠ³Π΄Π° компилируСтся само ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона. На этом этапС компилятор, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ошибок. Π—Π΄Π΅ΡΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² основном синтаксичСскиС ошибки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ пропущСнная Ρ‚ΠΎΡ‡ΠΊΠ° с запятой ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ написанноС имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ этап обнаруТСния ошибок β€” ΠΊΠΎΠ³Π΄Π° компилятор встрСчаСт ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ шаблона. На Π΄Π°Π½Π½ΠΎΠΌ этапС компилятор Ρ‚Π°ΠΊΠΆΠ΅ способСн ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎΠ΅. Для Π²Ρ‹Π·ΠΎΠ²Π° шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ компилятор ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ провСряя количСство ΠΈ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Он ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ совпадСниС Ρ‚ΠΈΠΏΠΎΠ² Π΄Π²ΡƒΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Для шаблона класса компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ количСство ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ прСдоставлСнных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² шаблона, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ этап обнаруТСния ошибок β€” ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания экзСмпляра. Волько Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ошибки, связанныС с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компилятор осущСствляСт созданиС экзСмпляра, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этих ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π²ΠΎ врСмя рСдактирования.

ΠŸΡ€ΠΈ написании шаблона ΠΊΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ спСцифичСским для Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСдполоТСния ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ…. НапримСр, ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare() ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π», Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <.

if (v1 < v2) return -1; // для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π’ трСбуСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <

if (v2 < v1) return 1;  // для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π’ трСбуСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <

return 0;               // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ int; Π½Π΅ зависит ΠΎΡ‚ Π’

Когда компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅Π»ΠΎ этого шаблона, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ условий Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… if. Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare() Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <, Ρ‚ΠΎ ΠΊΠΎΠ΄ сработаСт прСкрасно, Π½ΠΎ Π½Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. НапримСр:

Sales_data data1, data2;

cout << compare(data1, data2) << endl; // ошибка: Ρƒ Sales_data Π½Π΅Ρ‚

                                       // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <

Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² создаСт экзСмпляр Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare() с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π’, Π·Π°ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ классом Sales_data. Если условия ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ < для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Sales_data, Ρ‚ΠΎ окаТСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π΅Ρ‚. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится экзСмпляр Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π°. Π’Π°ΠΊΠΈΠ΅ ошибки, ΠΊΠ°ΠΊ эта, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹, ΠΏΠΎΠΊΠ° компилятор Π½Π΅ создаст экзСмпляр опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compare() для Ρ‚ΠΈΠΏΠ° Sales_data.

Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ вСсти сСбя ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π² Ρ‚ΠΎΠΌ контСкстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ шаблон ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡ….

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ созданиС экзСмпляра.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.2. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ собствСнныС вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ compare().