Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szablony, funkcja przyjmujaca tablice jako argument

Ostatnio zmodyfikowano 2018-03-31 10:06
Autor Wiadomość
YupYup
Temat założony przez niniejszego użytkownika
Szablony, funkcja przyjmujaca tablice jako argument
» 2018-03-30 19:36:08
Witam, ostrzegam ze dopiero zaczynam zabawe z szablonami :D
Chce zrobic funkcje BubbleSort, ktora jako argument bedzie przyjmowala tablice, którą będzie sortowana.
Funkcja wyglada tak:

template <typename BBsort>
void BubbleSort(BBsort t[])
{
size_t size = sizeof(t) / sizeof(t[0]);
int rozmiar = size;
for (int j = 0; j < rozmiar - 1; j++)
for (int i = 0; i < rozmiar - 1; i++)
if (t > t[i + 1]) std::swap(t, t[i + 1]);
}

i przy kompilacji wyrzuca mi: "error LNK2019: nierozpoznany zewnętrzny symbol "void __cdecl BubbleSort<int>(int * const)" (??$BubbleSort@H@@YAXQAH@Z) przywołany w funkcji _main"

Algorytm jest poprawny, wrzucilem to bez zadnej funkcji do maina i wszystko zostalo posortowane poprawnie.
FUnkcje wywoluje w taki sposob: BubbleSort(t);, gdzie t to 10 elementowa tablica intów.

I przy okazji mam jeszcze jedno pytanie. W pliku naglowkowym deklaracja powinna wygladac tak:
template <typename BBsort>
void BubbleSort(BBsort t[]);

a w pliku cpp definicja tak jak napisalem wyzej, czyli:
template <typename BBsort>
void BubbleSort(BBsort t[])
{
size_t size = sizeof(t) / sizeof(t[0]);
int rozmiar = size;
for (int j = 0; j < rozmiar - 1; j++)
for (int i = 0; i < rozmiar - 1; i++)
if (t > t[i + 1]) std::swap(t, t[i + 1]);
}
Czy dobrze myślę? :D
P-170370
YooSy
» 2018-03-30 19:39:41
Nie można rozdzielić deklaracji szablonu od definicji. Oba powinny być w pilkach nagłówkowych, a jeszcze lepiej w jednym dla tak małej funkcji.

size_t size = sizeof( t ) / sizeof( t[ 0 ] );
Przekazując do funkcji nazwę tablicy jest niejawnie rzutowana na wskaźnik na pierwszy element, więc tutaj dzielisz rozmiar wskaźnika przez rozmiar elementu.

Poczytaj o std::array i std::vector skoro już wchodzisz w szablony.
P-170371
YupYup
Temat założony przez niniejszego użytkownika
» 2018-03-30 19:47:17
Super, pomogło. Dziękuja bardzo :) I tak jak mowisz, poczytam o tym
P-170372
j23
» 2018-03-31 10:06:35
Tak możesz zrobić:
C/C++
template < typename BBsort, size_t size >
void BubbleSort( BBsort( & t )[ size ] )
{
    for( size_t j = 0; j < size - 1; j++ )
    ...
}


C/C++
size_t size =...
int rozmiar = size;
Wyborne :)
P-170381
« 1 »
  Strona 1 z 1