Szablony funkcji i specjalizacja z tablicą pięciu łańcuchów
Ostatnio zmodyfikowano 2016-07-17 21:14
Siedemdayz Temat założony przez niniejszego użytkownika |
Szablony funkcji i specjalizacja z tablicą pięciu łańcuchów » 2016-07-17 18:53:26 Witam Mam do wykonania jedno z zadań z podręcznika "Szkoła programowania" o treści: Napisz szablon funkcji maxn() pobierającej jako parametry tablicę typu T oraz liczbę elementów tej tablicy, zwracającej największy element tablicy. Przetestuje w programie 5-elementową tablicę wartości int i 4-elementową tablicę double. Program powinien korzystać ze specjalizacji przyjmującej jako parametr tablicę typu char, zwracającej adres najdłuższego napisu. Jeśli jest kilka najdłuższych napisów, funkcja powinna zwracać adres pierwszego z nich. Sprawdź specjalizację z tablicą pięciu łańcuchów. Niestety nie ogarniam tej części ze specjalizacją. Kompilator wyrzuca mi błąd o niezgodności specjalizacji z żadnym z template`ów. Ktoś byłby w stanie wytłumaczyć co robię nie tak i jak to poprawić? #include <iostream> #include <cstring>
template < typename T > void fill_array( T & a, int n = 5 ) { std::cout << "\nPodaj " << n << " wartości do tablicy: " << std::endl; for( int i = 0; i < n; ++i ) { std::cin >> a[ i ]; } }
template < typename T > void show_array( const T & a, int n = 5 ) { std::cout << "\nOto Twoja tablica: " << std::endl; for( int i = 0; i < n; ++i ) { std::cout << i + 1 << ". " << a[ i ] << std::endl; } }
template < typename T > T get_return( const T a[], int n = 5 ) { T temp = a[ 0 ]; for( int i = 0; i < n; ++i ) { if( a[ i ] > temp ) temp = a[ i ]; } return temp; }
template <> char * get_return( char * words, int n ) { char * temp = words[ 0 ]; for( int i = 0; i < n, i++ ) { if( strlen( words[ i ] ) > strlen( temp ) ) temp = words[ i ]; } std::cout << "\nNajdluzszy wyraz z podanego łańcucha to: " << temp << std::endl; return temp; }
char * fill_charray() { char * wyrazy = new char[ 100 ]; std::cout << "\nWprowadź coś do tablicy charów: " << std::endl; std::cin.get(); std::cin.getline( wyrazy, 100 ); return wyrazy; }
int main() { double tab_double[ 4 ]; double max_double; int tab_int[ 5 ]; int max_int; fill_array( tab_int ); fill_array( tab_double, 4 ); show_array( tab_int ); show_array( tab_double, 4 ); max_int = get_return( tab_int ); max_double = get_return( tab_double, 4 ); std::cout << "\nTwój największy int: " << max_int << std::endl; std::cout << "Twój największy double: " << max_double << std::endl; char * charray = fill_charray(); char * tlword = get_return( charray, 100 ); return 0; }
|
|
carlosmay |
» 2016-07-17 21:14:20 Kompilator wyrzuca mi błąd o niezgodności specjalizacji z żadnym z template`ów. |
Nie da się wyspecjalizować takiego szablonu, w ten sposób, jak to robisz dla typu char*Użyj przeciążenia funkcji. Niby piszą, że to też jest specjalizowana funkcja (nie specjalizacja szablonu funkcji). Mam nadzieję, że nic nie pokręciłem. Działający kod: #include <iostream> #include <cstring>
template < typename T > T maxElement( T arr[], std::size_t size ) { T tmp = arr[ 0 ]; for( std::size_t i = 1; i < size; ++i ) { if( tmp < arr[ i ] ) { tmp = arr[ i ]; } } return tmp; }
char * maxElement( char * arr[], std::size_t size ) { char * tmp = arr[ 0 ]; for( std::size_t i = 1; i < size; ++i ) { if( strlen( tmp ) < strlen( arr[ i ] ) ) { tmp = arr[ i ]; } } return tmp; }
int main() { constexpr std::size_t C_SIZE = 5; char * words[] = { "aaaaa", "bbbbbbbb", "cccc", "dddddddd", "ee" }; constexpr std::size_t D_SIZE = 4; double numbers[] = { 1.11, 2.22, 3.33, 4.44 }; std::cout << "Max wartosc: " << maxElement( numbers, D_SIZE ) << '\n'; std::cout << "Wyraz o max dlugosci to: " << maxElement( words, C_SIZE ) << '\n'; }
|
|
« 1 » |