Skocz do zawartości
Ghazi

[c++] Problem Z Szablonem Funkcji

Rekomendowane odpowiedzi

Witam Kolegów!

 

Program w założeniu cwiczy poslugiwanie sie szablonami klas, funkcji oraz przeciazanie operatora wyjscia. 99,9% jest ok, jednak pojawił się mały, irytujący problem.

 

W szablonie funkcji "maks" zwracam maksymalna wartosc z tablicy. Tablica jest losowo zapełniana "kwadratami" lub "zesp" (liczbami zepspolonymi). Niestety, w rzeczonej funkcji "maks" wystepuje problematyczny fragment "return max.dlugosc();" Jednak dlugosc jest charakterystyczna dla klasy "zesp" i tym sposobem w szablonie nie moge odnosic sie do klasy "kwadrat", gdzie mam funkcje "pole". Pierwotnie rozwiazalem to nazywajac rozne funkcje w obu klasach tak samo tj. "dlugosc", jednak w "kwadracie" funkcja o nazwie "dlugosc" liczy pole i wygląda to conajmniej mało fachowo.

 

Wpadłem na pomysł, że funkcja będzie zwracać wskaźnik na max'ymalny element tablicy. Tu pojawił się problem z realizacją...

 

Tutaj problematyczny fragment:

 

template <class typ>int lista<typ>::maks(){   typ max = tablica[0][0];   for(int i = 0; i < ilosc; i++)   {	  for(int j = 0; j < ilosc; j++)	  {		 if(tablica[i][j] > max)		 {			max = tablica[i][j];		 }	  }   }   return max.dlugosc();//return lista->max//return lista.max}

Chciałem "return max.dlugosc()" zastąpić przez "return lista->max", ale kompilator stwierdza, ze

"[C++ Error] popr.cpp(178): E2102 Cannot use template 'lista<typ>' without specifying specialization parameters"

 

Prosze o porady :damage_wall:

 

Cały kod

 

» Naciśnij aby pokazać/ukryć tekst oznaczony jako spoiler « - "Pełen kod programu"
#include <iostream.h>#include <cstdlib.h>#include <time.h>using namespace std;/////////////////////////////KWADRAT//////////////////////////////////////////////klasa kwadratclass kwadrat{   private:	  int bok;   public:	  kwadrat();	  int pole(void);	  friend ostream& operator<<(ostream&, kwadrat);	  bool operator>(kwadrat);	  bool operator<(kwadrat);};kwadrat::kwadrat() //konstruktor losowy{   bok = rand() % 10 + 1;}int kwadrat::pole(void){   return bok*bok;}bool kwadrat::operator>(kwadrat obiekt){   if(pole() >= obiekt.pole())   {	  return true;   }   else return false;}bool kwadrat::operator<(kwadrat obiekt){   if(pole() <= obiekt.pole())   {	  return true;   }   else return false;}// przeladowanieostream & operator<<(ostream& wyjscie, kwadrat obiekt){   wyjscie << obiekt.pole();   return wyjscie;}class zesp{   private:	  int Re;	  int Im;   public:	  zesp();	  int dlugosc(void);	  friend ostream& operator<<(ostream&, zesp);	  bool operator>(zesp);	  bool operator<(zesp);};zesp::zesp(){   Re = rand() % 20 - 10;   Im = rand() % 20 - 10;}int zesp::dlugosc(){   return (Re*Re + Im*Im);}bool zesp::operator>(zesp obiekt){   if(dlugosc() >= obiekt.dlugosc())   {	  return true;   }   else return false;}bool zesp::operator<(zesp obiekt){   if(dlugosc() <= obiekt.dlugosc())   {	  return true;   }   else return false;}////przeladowanieostream & operator<<(ostream& wyjscie, zesp obiekt){   wyjscie << obiekt.dlugosc();   return wyjscie;}template <class typ>   //klasa szablonowaclass lista{   private:	  int ilosc;	  typ ** tablica;   public:	  lista();	  void wyswietl();	  void losuj(int);	  int maks(void);	  ~lista();};template <class typ>lista<typ>::lista(){   ilosc = 0;   tablica = NULL;}template <class typ>void lista<typ>::wyswietl(){   for(int i = 0; i < ilosc; i++)   {	  for(int j = 0; j < ilosc; j++)	  {		  cout << tablica[i][j] << ' '; //tutaj wywolanie	  }	  cout << endl;   }}template <class typ>void lista<typ>::losuj(int ile){   if(ile <= 0)   {	  return;   }   else   {	  ilosc = ile;	  tablica = new typ*[ilosc];	  for(int i = 0; i < ile; i++)	  {		  tablica[i] = new typ[ilosc];	  }   }}template <class typ>int lista<typ>::maks(){   typ max = tablica[0][0];   for(int i = 0; i < ilosc; i++)   {	  for(int j = 0; j < ilosc; j++)	  {		 if(tablica[i][j] > max)		 {			max = tablica[i][j];		 }	  }   }   return lista->max;   //return max.pole();}template <class typ>lista<typ>::~lista(){   delete [] tablica;}int main(){   srand(time(NULL));   lista<kwadrat> LK;   LK.losuj(4);   LK.wyswietl();   cout << endl;   cout << LK.maks() << endl << endl;   lista<zesp> LZ;   LZ.losuj(4);   LZ.wyswietl();   cout << endl;   cout << LZ.maks() << endl << endl;   system("PAUSE");   return 0;}
Edytowane przez Ghazi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

na 1 rzut oka

 

template <class typ>

typ lista<typ>::maks()

{

typ max = tablica[0][0];

for(int i = 0; i < ilosc; i++)

{

for(int j = 0; j < ilosc; j++)

{

if(tablica[j] > max)

{

max = tablica[j];

}

}

}

return max;

 

}

 

i w deklaracji tez zmien

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...