IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> шаблоны функций, с++
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


прграмма должна выполднять следующие действия:
-выяислять произведение отрицательных эл-тов одномерного массива
-находить сумму эл-тов до максимального эл-та.
но вся прблема в шаблонах.
я сделала шаблон (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;
}


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата(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;

}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


большое спасибо!
теперь всё предельно ясно =)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 8:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name