3-misol. Operatorlar, funksiya chaqiruvlari va funksiya shablonlari. Funksiya shablonlari asosiy ma'lumotlar turlari (char, int, double va boshqalar) bilan ham, sinflar bilan ham ishlaydi (lekin nyuans mavjud). Shablon nusxasi oddiy funksiya kabi tuzilgan. Oddiy funksiya da ushbu funksiyada ishlatiladigan har qanday operatorlar yoki boshqa funksiyalarga murojaatlar aniqlangan/qayta yuklangan bo'lishi kerak, aks holda siz kompilyatsiya xatosini olasiz. Xuddi shunday, funksiya shablonida mavjud bo'lgan har qanday bayonotlar yoki boshqa funksiyalarga murojaatlar faktik (jo’natiladigan) ma'lumotlar turlari bilan ishlash uchun aniqlanishi / qayta yuklanishi kerak. Keling, buni amalda ko'rib chiqaylik.
Birinchidan, oddiy sinf yaratamiz. Dollars sinfidagi obyektlar bilan max() funksiyasini chaqirishga harakat qilganda nima sodir bo'lishini ko'rib chiqaylik:
#include
using namespace std;
template
const T& max1(const T& a, const T& b)
{
return (a > b) ? a : b;
}
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars)
{
m_dollars = dollars;
}
};
int main()
{
Dollars seven(7);
Dollars twelve(12);
Dollars bigger = max1(seven, twelve);
return 0;
}
C++ tili max () funksiya shablonining quyidagi nusxasini yaratadi:
const Dollars& max(const Dollars &a, const Dollars &b)
{
return (a > b) ? a : b;
}
Keyin kompilyator ushbu funktsiyani kompilyatsiya qilishga harakat qiladi, lekin u ishlamaydi, chunki C++ a> b ifodasini qanday boshqarishni bilmaydi! Shunday qilib, bu xatoga olib keladi:
Ошибка C2676 бинарный ">": "const T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Ushbu xatolar o'rtacha qiymatga chaqiruv (Dollars *, int) tomonidan yaratilgan funksiya shablonining nusxasi tufayli yuzaga kelgan. Esda tutingki, funksiya shablonini chaqirganda, kompilyator funksiya shablonini parametr turlari bilan ko'chiradi va keyin shablon parametrlari turlarini faktik (jo’natilgan) ma'lumotlar turlari bilan almashtiradi.
#include
using namespace std;
template
T average(T *array, int length)
{
T sum = 0;
for (int count=0; count < length; ++count)
sum += array[count];
sum /= length;
return sum;
}
class Dollars
{
private:
int m_dollars;
public:
Dollars(int dollars)
: m_dollars(dollars)
{
m_dollars = dollars;
}
friend bool operator>(const Dollars &d1, const Dollars &d2)
{
return (d1.m_dollars > d2.m_dollars);
}
friend ostream& operator<< (ostream &out, const Dollars &dollars)
{
out << dollars.m_dollars<< " dollars ";
return out;
}
Dollars& operator+=(Dollars dollars)
{
m_dollars += dollars.m_dollars;
return *this;
}
Dollars& operator/=(int value)
{
m_dollars /= value;
return *this;
}
};
int main()
{
Dollars array3[] = { Dollars(7), Dollars(12), Dollars(18), Dollars(15) };
cout << average(array3, 4) << '\n';
return 0;
}
Do'stlaringiz bilan baham: |