Szablony, funkcja przyjmujaca tablice jako argument
Ostatnio zmodyfikowano 2018-03-31 10:06
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 |
|
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. |
|
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 |
|
j23 |
» 2018-03-31 10:06:35 Tak możesz zrobić: template < typename BBsort, size_t size > void BubbleSort( BBsort( & t )[ size ] ) { for( size_t j = 0; j < size - 1; j++ ) ... }
size_t size =... int rozmiar = size; |
Wyborne :) |
|
« 1 » |