Помощь - Поиск - Пользователи - Календарь
Полная версия: шаблоны функций
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Tribunal
прграмма должна выполднять следующие действия:
-выяислять произведение отрицательных эл-тов одномерного массива
-находить сумму эл-тов до максимального эл-та.
но вся прблема в шаблонах.
я сделала шаблон (1)для ф-ии нахождения максимума и (2)объединение вышеуказанных действий в одну функцию...
до того,как яя сделала (2) всё работало хорошо.
а сейчас он говорит,что нет соответствующей ф-ии с названием act.
не могу понять в чем проблема=(

#include <iostream.h>

template <class T> T iMax(T*x, int k);
template <class Y> Y act(Y*x, Y*p, Y*s, int k);

int main()
{
const int n = 3;

//for int numbers
int a[n],pa,sa;
cout << "Enter " << n << " int numb-s:" << endl;
act(a,pa,sa,n);

//for float numbers
float b[n],pb,sb;
cout << "Enter " << n << " float numb-s:" << endl;
act(b,pb,sb,n);

//for double numbers
double c[n],pc,sc;
cout << "Enter " << n << " float numb-s:" << endl;
act(c,pc,sc,n);

}

template <class T> T iMax(T *x,int k)
{
int imax=0;
for (int i=1;i<k;i++)
if (x[i]>x[imax]) imax=i;
return imax;
}

template <class Y> Y act(Y *x,Y *p,Y *s, int k)
{
for (int i=0;i<k;i++) cin >> x[i];

p=1;
for (int i=0;i<k;i++)
if (x[i]<0) p=p*x[i];
cout << "Multiply of (-) elements: " << p << endl;

s=0;
for (int i=0;i<iMax(x,k);i++) s=s+x[i];
cout << "Sum up to max element: " << s << endl;
}
volvo
Цитата(Tribunal @ 6.11.2006 15:51) *
до того,как яя сделала (2) всё работало хорошо.
а сейчас он говорит,что нет соответствующей ф-ии с названием act.
не могу понять в чем проблема=(

Компилятор прав... Смотри, что ты делаешь внутри act:
    for (int i=0;i<iMax(x,k);i++) s=s+x[i];
То есть, тебе iMax должна вернуть int в любом случае, так? Почему же ты описываешь тип возвращаемого значения iMax шаблонным типом T? Это должен быть int

Это первое... Второе: int и const int в С++ - совершенно разные вещи, и перемешивать их компилятор тебе не позволит... Автоматически преобразование неконстантной переменной в константную не делается, поэтому при описании шаблона ты должна дописывать const, если не хочешь делать приведение вручную при вызове функции iMax...

Ну, и третье... До тех пор, пока ты не перенесешь реализацию шаблонных функций выше основной программы, откуда они вызываются, программа не откомпилируется, потому, что компилятор просто не знает, что подставлять, и допустимо ли это...

Кстати, вместо того, чтобы работать с указателями при возвращении параметра (аналог Var-параметров в Паскале), С++ имеет очень хорошую замену в виде ссылок... Вот так я бы переделал твою программу:
#include <iostream.h>

template <class T>
int iMax(T *x, const int k)
{
int imax=0;
for (int i = 1; i < k; i++)
if (x[i] > x[imax]) imax = i;
return imax;
}

template <class T> void act(T *x, T &p, T &s, const int k)
{
for (int i=0;i<k;i++) cin >> x[i];

p=1;
for (i=0;i<k;i++)
if (x[i]<0) p=p*x[i];
cout << "Multiply of (-) elements: " << p << endl;

s=0;

for (i=0; i < iMax(x,k); i++) s=s+x[i];
cout << "Sum up to max element: " << s << endl;
}


int main()
{
const int n = 3;

//for int numbers
int a[n],pa,sa;
cout << "Enter " << n << " int numb-s:" << endl;
act(a,pa,sa,n);

// for float numbers
float b[n],pb,sb;
cout << "Enter " << n << " float numb-s:" << endl;
act(b,pb,sb,n);

// for double numbers
double c[n],pc,sc;
cout << "Enter " << n << " float numb-s:" << endl;
act(c,pc,sc,n);
return 0;

}
Tribunal
большое спасибо!
теперь всё предельно ясно =)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.