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

Szablony funkcji i specjalizacja z tablicą pięciu łańcuchów

Ostatnio zmodyfikowano 2016-07-17 21:14
Autor Wiadomość
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ć?

C/C++
#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;
}
P-150076
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:
C/C++
#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';
}
P-150082
« 1 »
  Strona 1 z 1