• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szablony klas i niezrozumialy blad kompilatora. C++

Object Storage Arubacloud
0 głosów
371 wizyt
pytanie zadane 17 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

Witam zanim wyjasnie swoj problem wrzuce kod.

#include <iostream>
#include <string>

using namespace std;

template <class typ, int liczba_wymiarow, int *wymiary=new int[liczba_wymiarow]> class Tablica;


class Baza_danych; 


template <class typ, int liczba_wymiarow, int *wymiary=new int[liczba_wymiarow]> 
class Tablica
{
int liczba_wymiaro=liczba_wymiarow;
int *wymiary=new int [liczba_wymiaro];
string nazwa;


public:
void wczytaj()
{
cout<<"Podaj nazwe tablicy"<<endl;cin>>nazwa;
for(int i=0;i<liczba_wymiaro;i++)
{
cout<<"Podaj wymiar nr : "<<i+1<<endl;
cin>>wymiary[i];

}

}
void wyswietl_atrybuty()
{
cout<<"typ : "<<endl;
cout<<"nazwa: "<<nazwa<<endl;
}



};

int main()
{

Tablica < char, 2, {4,6} > nowa;
nowa.wczytaj();
nowa.wyswietl_atrybuty();


return 0;
}

Dobra to jest kod kompilator wywala mi takie bledy

/home/User/Programownaie/C++/Gielda/BibliotekaKlas.cpp|13|error: redefinition of default argument for ‘int* wymiary’|
/home/User/Programownaie/C++/Gielda/BibliotekaKlas.cpp|6|note: original definition appeared here|
/home/User/Programownaie/C++/Gielda/BibliotekaKlas.cpp||In function ‘int main()’:|
/home/User/Programownaie/C++/Gielda/BibliotekaKlas.cpp|45|error: template argument 3 is invalid|
/home/User/Programownaie/C++/Gielda/BibliotekaKlas.cpp|45|error: ‘nowa’ was not declared in this scope|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

Domyslam sie ze pierwszy blad wiaze sie z tym ze zadeklarowalem sobie tablice dynamiczna w szablonie klasy ale nie wiem jak inaczej sobie z tmy poradzic. Ale przy innych bledach nie wiem o co chodzi dobija mnie szczegolnie jeden o ten :template argument 3 is invalid.

Skad sie wzielo "3" ?!

Z gory dzieki za pomoc.

PS: Dodam ze szablony klas to dla mnie nowy i temat i przy wyjasnieniu prosze nie uzywac akademickich nazw bo jestem koderem amatorem i ich nie rozumiem. Dzieki :D

 

2 odpowiedzi

0 głosów
odpowiedź 17 października 2015 przez Radfler VIP (101,030 p.)

Po kolei wyjaśnię Ci wszystkie błędy:

1. Zrobiłeś ponowną deklarację domniemanego (domyślnego) argumentu szablonu. Takie domniemanie stawiamy przy deklaracji, a jeśli takiej nie ma to przy definicji,

2. Ten "template argument 3 is invalid" pojawił się, gdyż trzeci argument jest po prostu nieprawidłowy. To co napisałeś to z tego co pamiętam nazywa się brace-init-list. Powinieneś tu postawić wyrażenie, którego typem jest wskaźnik na int.

3. Ten błąd jest skutkiem drugiego błędu.

Pozdrawiam! :)

komentarz 17 października 2015 przez 0xf Dyskutant (8,180 p.)
Wielkie dzieki, rozumiem ze tablic sie nie deklaruje w template'ach. Jak zauwazyles 2 argument jest powiazany z 3 (w tym template) jak to zrobic na inny sposob ?
komentarz 17 października 2015 przez Radfler VIP (101,030 p.)

Możesz ten wskaźnik wymiary przenieść z argumentu szablonu, do środka klasy jako pole:

template <class typ, int liczba_wymiarow> 
class Tablica {
  int* wymiary = new int[liczba_wymiarow];
  // ...
};

O to Ci chodzi? Jak nie to sprecyzuj :)

komentarz 17 października 2015 przez 0xf Dyskutant (8,180 p.)
Juz tlumacze ja to pisze po to zeby moc szybko tworzyc tablice dynamiczne wielkowymiarowe. Dajmy na to ze tworzymy tablice 2-wymiarowa czyli mamy os x i y

x=6

y=7

czyli chcialbym otrzymac prostokat 7x6 a w nim 42 szufladki na zmienne jakiegos tam typu.

O to mi chodzi i chcialbym poprostu moc w latwy sposob taki obiekt wywolac w kodzie.
komentarz 18 października 2015 przez Radfler VIP (101,030 p.)
Hmm... Mam na to pomysł, tylko mam pytanie: czy wiesz co to jest częściowa specjalizacja szablonu i paczka parametrów? Jak nie, to cięzko będzie mi pomóc Tobie :/
komentarz 18 października 2015 przez 0xf Dyskutant (8,180 p.)
Niestety nie wiem ale jak poczytam i zrozumiem, dam znac w komentarzu :D
0 głosów
odpowiedź 17 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Pamiętaj, że ogólna deklaracja szablonu klasy wygląda tak:

template<class Typ1, class Typ2 //...>
class Klasa
{
	//...
};

Możesz opcjonalnie nadać wartości domyślne argumentom szablonu, ale to tyle. Nie można sobie tam tworzyć jakiś tablic, czy innych dziwnych rzeczy, jedynie typy danych.

komentarz 17 października 2015 przez Radfler VIP (101,030 p.)
Nooo, nie tylko. Argumentem szablonu może być typ całkowity, referencja lub wskaźnik na dowolny typ, enum itd.

http://en.cppreference.com/w/cpp/language/template_parameters
komentarz 17 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
Pragnę zauważyć, że wskaźnik/referencja, enum, czy unia też jest jakiegoś typu...
komentarz 17 października 2015 przez Radfler VIP (101,030 p.)
Chyba, że o to Ci chodziło. Myslałem, że chodzi Ci, że argument szablonu może być tylko typem danych. Zwracam honor :)
komentarz 17 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Nie ma sprawy. Oczywiście chodziło mi o wszystkie typy. Wiem, że napisałem to trochę nie jasno, więc miałeś prawo mieć wątpliwości wink

Podobne pytania

0 głosów
1 odpowiedź 109 wizyt
0 głosów
1 odpowiedź 199 wizyt
0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 9 maja 2022 w Systemy CMS przez renegat Obywatel (1,020 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...