Jawne specjalizacje

0

Witam!!
Mam takie zadanie, mam napisać program który wykorzystuje szablon to zwrócenia największej wartości w tablicy, funkcja przyjmuje tablice(adres) oraz jej rozmiar, program ma tez korzystać ze specjalizacji w której przyjmuje tablice typu char i zwraca adres najdłuższego wyrazu.

Problem mam taki że nie bardzo rozumiem te specjalizacje, mógłby mi to ktoś jakoś przybliżyć.
ciągle mam taki błąd [Error] template-id 'maxn<char*>' for 'char* maxn(char*, int)' does not match any template declaration

oto co napisałem

#include <iostream>

const int SIZE = 5;

template <typename T>
T maxn(T tab[], int rozmiar);

template<> char* maxn<char*>(char* tab[], int rozmiar);

int main(void)
{
    int tab1[10] = {1, 5, 2, 7, 0, 5, 8 ,94, 158, 147};
    double tab2[6] = {100, 98.5, 14.5, 4, 9, 454.987};
    const char* tab3[7] = {"ala", "ma", "kota", "oraz", "dwie", "dzikie", "dwujednorożce"};
    int a;
    double b;
    char * ch, * wsk;
        
    a = maxn(tab1, 10);
    b = maxn(tab2, 6);
    ch = maxn(tab3, 7);
    
    std::cout << a << "    " << b << std::endl;
    std::cout << ch << std::endl;
    
    return 0;    
}

template <typename T>
T max5(T tab[], rozmiar )
{
    T x = tab[0];
    for(int i = 1; i < rozmiar ; i++)
        if(tab[i] > x)
            x = tab[i];
    
    return x;
}
template <> const char* maxn(const char* tab[], int rozmiar) 
{
  unsigned len = 0;
  int j = 0;
  for(int i = 0; i < rozmiar; i++)
    if(len < strlen(tab[i])) {
      len = strlen(tab[i]);
      j = i;
    }
    return tab[j];
}
0

dlaczego mam prototyp usuwać??

I tak nie działa po usunięciu

0

wszystko działa ale wciąż nie rozumiem dlaczego.

1.dlaczego nie ma prototypu mimo że przykłady w książce wszystkie mają??

2.template <> const char* maxn(const char* tab[], int rozmiar) a u mnie wygląda tak template <> char* maxn< char*>(const char tab, int rozmiar);
dlaczego pominąłeś ten fragment < char
>??

3.ch = (char*)maxn(tab3, 7); skoro w specjalizacji jest const i w mainie jest const to poco rzutowanie??

0

dzięki wielkie, ale prosiłbym o parę słów wyjaśnienia bo nic nie rozumiem.

0

nie umiem angielskiego w stopniu do czytania takich rzeczy, poza tym porównuje twoje i swoje, i nie rozumiem dlaczego twoje działa a moje nie nawet jak poprawiłem.
Dlatego proszę, albo błagam o wyjaśnienie. Mam książki do c++, i czytałem o tym ale po prostu tego nie rozumiem, Dlatego się odezwałem na tym forum

0

Twoje bledy:
1.

template<> char* maxn<char*>(char* tab[], int rozmiar);
template <> const char* maxn(const char* tab[], int rozmiar)

const char* to nie to samo co char*

template <typename T> T maxn(T tab[], int rozmiar);
template <typename T> T max5(T tab[], rozmiar )

Nazwy Ci sie pomylily...

template <typename T> T max5(T tab[], rozmiar )

brakuje int przy argumencie rozmiar.

ch = maxn(tab3, 7);

Dla const char* niezbedne jest jawne rzutowanie.

if(len < strlen(tab[i])) {

Uzywasz strlen() nie dodajac odpowiedniego naglowka.

Reszta jest ok (chyba, ze o czyms zapomnialem to prosilbym o poprawke).

0

Głupie błędy porobiłem, ale dalej nie wiem jak se radzić ze specjalizacją i dlaczego pominąłeś <char*>??? te nawiasy zawierają typ specjalizacji, więc dlaczego je pomijasz??

0

dzięki za to

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