specjalizacja szablonu funkcji

0

poniżej deklaracja szablonu funkcji, na 7 linii kompilator wywala błąd
"error: template-id 'biggeststd::__cxx11::string' for 'void biggest(std::string, int)' does not match any template declaration|

#include <iostream>

using namespace std;

template <typename T>
T biggest(T tab[],int n);
template <> void biggest<string>(string wyraz,int dlugosc);

może mi ktoś wytłumaczyć dlaczego deklaracja nie pasuje do żadnego szablonu?

4

Masz szablon T(T[],int), jak chcesz go specjalizować, to musisz podmienić wszystkie T i tylko je. Nie możesz zmienić wskaźnika na wartość, tak jak to zrobiłeś, więc specjalizacja może co najwyżej wyglądać tak:

template <typename T>
T biggest(T tab[],int n);

template <>
string biggest(string wyraz[],int dlugosc);
0

no tak logiczne, dzieki wielkie

0

napisałem program wykorzystujący szablony i jedną specjalizacje, ale się nie kompiluje, staje na wywołaniu funkcji wyspecjalizowanej wiersz 41 i pisze, że nie ma pasujących funkcji, a przeciez pierwszy parametr jest string a drugi int i wartosc zwracana string

#include <iostream>
#include <string>

using namespace std;

template <typename T>
T biggest(T tab[],int n);
template <> string biggest<string>(string wyraz[],int dlug);


int main()
{
    int dlugoscInt, dlugoscDouble;

        cout << "podaj dlugosc tablicy int" << endl;
        cin>>dlugoscInt;
    int tablicaInt[dlugoscInt];
        for(int i=0;i<dlugoscInt;i++)
        {
            cout<<"podaj inta"<<endl;
            cin>>tablicaInt[i];
        }

        cout << "podaj dlugosc tablicy double" << endl;
        cin>>dlugoscDouble;
        double tablicaDouble[dlugoscDouble];
        for(int i=0;i<dlugoscDouble;i++)
        {
            cout<<"podaj doubla"<<endl;
            cin>>tablicaDouble[i];
        }
    string napis;

        cout<<"napisz cos"<<endl;
        cin.ignore();
        getline(cin,napis);

        int dlugoscString=napis.length();

        cout<<biggest(tablicaInt,dlugoscInt)<<endl;
        cout<<biggest(tablicaDouble,dlugoscDouble)<<endl;
        cout<<biggest(napis,dlugoscString)<<endl;

    return 0;
}
template <typename T>
T biggest(T tab[],int n)
{
    T maks;
    maks=tab[0];
    for(int i=0;i<n;i++)
    {
        if (maks<tab[i])
            maks=tab[i];
    }
    return maks;
}

template <> string biggest<string>(string wyraz[],int dlug)
{
    string maks;
    maks[0]=wyraz[0];

    for(int i=0;i<dlug;i++)
    {
        if(maks[0]<wyraz[i])
            maks[0]=wyraz[i];
    }
       return maks[0];
}


2

Parametrem funkcji jest wskaźnik na string (string[]), a nie string.

0

Ok, jak przekaże w wywołaniu funkcji &napis to się kompiluje, ale ogólnie jak wysyłałem tablice np. Intow do funkcji to było funkcja(tablica, długość) a sygnatura funkcji funkcja(tablica[],długość) dlaczego dla zwykłych tablic nie trzeba dodawać & a dla stringa trzeba? I jeszcze ta funkcja wyspecjalizowana w powyższym kodzie dla stringa większego niż jedna litera i znak końca wiersza nie działa. Możesz podrzucić jakieś tematy, które powinienem zgłębić żeby to zrozumieć? Pisze z komórki i nie mogę sformatować tego posta wiec sorry ze tak wyglada.

1

Tak po prawdzie nie wiem co chcesz osiągnąć. Tablice w C w wielu przypadkach należy traktować jak wskaźnik na ich pierwszy element (np. dlatego nazywałem parametr funkcji wyżej wskaźnikiem). std::string to poprawny kontener i z nim nie trzeba się w ten sposób bawić, ale sygnaturę szablonu już masz narzuconą, więc jej nie ominiesz. Może po prostu przeładuj funkcję dla stringa?

0

W tej wyspecjalizowanej funkcji chce zwrócić do main najniższa literę alfabetu ze zdania które napisze, ale ciekawi mnie właśnie dlaczego string z & przed nazwa zmiennej string jako parametr przy wywołaniu sprawia ze ten program się kompiluje a jak dam sama nazwę (jak robiłem przy zwykłych tablicach i działało) to się nie kompiluje

3

Nie kompiluje się, bo się typy nie zgadzają.

0

Ok może to mój kompilator puszcza, chociaż funkcja nie działa prawidłowo. Muszę chyba powtórzyć sobie przekazywanie tablic do funkcji. Bardzo dziękuje za pomoc

0

Nie potrzebujesz specjalizacji tylko zwykły overload.

Swoja drogą co ten szablon ma osiągnąć? i dlaczego potrzebujesz specjalizacji?

0

to tylko ćwiczenie, uczę się i chciałem zobaczyć jak działa specjalizacja, swoją drogą trudno mi zrozumieć po co używa się sepcjalizacji szablonu, skoro jak znamy typ to możemy użyć zwykłego przeciążenia, jakie korzyści daje użycie wyspecjalizowanego szablonu

1 użytkowników online, w tym zalogowanych: 0, gości: 1