Obługa listy z wykorzystaniem szablonów

0

Chciałabym zdefiniować funkcje dodawania elementu do listy, wyświetlania listy i usuwania listy dla elementów różnych typów - w pierwszym przypadku dla typów zmiennoprzecinkowych, w drugim dla danych typu student. Gdy w deklaracji funkcji dodawania elementu wpiszę np.

template<class T>
 T *add_to_list(T *first, element data) 

funkcja działa poprawnie dla elementów zmiennoprzecinkowych, ale gdy próbuję zamienić "element" na typ szablonowy np.

 
template <class X>
template<class T>
 T *add_to_list(T *first, X data)

pojawiają się komunikaty o błędach
"Error 1 error C3857: 'add_to_list': multiple template parameter lists are not allowed
Error 2 error C2563: mismatch in formal parameter list"
więc pewnie błąd jest w użyciu szablonów.
Proszę o pomoc lub wskazówki jak rozwiązać ten problem.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

/*__________________________________________________*/

/* LISTA ZMIENNOPRZECINKOWA */
struct element
{
    double x;
};

struct lista
{
    element data;
    lista *next;

};

/*__________________________________________________*/

/* LISTA STUDENT */
struct student
{
    string imie;
    string nazwisko;
    string indeks;
};

struct listaStudent
{
    student data;
    listaStudent *next;
};

/*__________________________________________________*/

template <class X>
template<class T>

T *add_to_list(T *first, X data) //dodaje wartosc na poczatek listy
{
    T *wsk = new T;
    wsk->data = data;
    wsk->next = first;

    return wsk;
}

/*__________________________________________________*/

template<class T>
void print_list(T *first) //wyswietla liste
{
    while (first != NULL) //do konca listy
    {
        cout << "Lista --> " << first->data.x << "  "; //wyswietlamy wartosc
        first = first->next; //pzesuwamy sie na nastepny element listy
    }
}

/*__________________________________________________*/

template<class T>
T *clear(T *first) //czyszczenie listy studentow
{
    T *wsk;
    while (first != NULL)
    {
        wsk = first->next;
        free(first);
        first = wsk;
    }
    return first;
}

/*__________________________________________________*/

void typdouble()
{
    int i, n, x;

    cout << "Podaj ile elementow \n";
    cin >> n;

    double *tab = new double[n];

    for (i = 0; i<n; i++)
    {
        cout << "Podaj element " << i + 1 << '\n';
        cin >> tab[i];
    }

    lista *first = NULL;
    lista *last = NULL;
    element data;

    // DODAWANIE PIERWSZEGO ELEMENTU
    for (i = 0; i<n; i++)
    {
        data.x = tab[i];
        if (i == 0)
            first = last = add_to_list(first, data);
        else
            first = add_to_list(first, data);
        cout << "Dodaj pierwszy " << data.x << '\n';
    }


    cout << '\n';
    print_list(first);
    cout << '\n';
    cout << '\n';

    first = last = clear(first);
    cout << '\n';
    cout << '\n';
}

void typstudent()
{
    int i, n;

    cout << "Podaj ile elementow \n";
    cin >> n;

    student *tab = new student[n];

    //PODAWANIE DANYCH STUDENTOW
    for (i = 0; i<n; i++)
    {
        cout << "Podaj element " << i + 1 << '\n';
        cout << "Imie: " << '\n';
        cin >> tab[i].imie;
        cout << "Nazwisko: " << '\n';
        cin >> tab[i].nazwisko;
        cout << "Indeks: " << '\n';
        cin >> tab[i].indeks;
    }

    listaStudent *first = NULL;
    listaStudent *last = NULL;
    student data;

    // DODAWANIE PIERWSZEGO ELEMENTU
    for (i = 0; i<n; i++)
    {
        data.imie = tab[i].imie;
        data.nazwisko = tab[i].nazwisko;
        data.indeks = tab[i].indeks;

        if (i == 0)
            first = last = add_to_list(first, data);
        else
            first = add_to_list(first, data);
        cout << "Dodaj pierwszy " << data.imie << '\n';
    }


    cout << '\n';
    print_list(first);
    cout << '\n';
    cout << '\n';
}
int main()
{
    typdouble();

    system("pause");
    return 0;
}

 
1
template <class X>
template<class T>
 
T *add_to_list(T *first, X data) //dodaje wartosc na poczatek listy
{
    T *wsk = new T;
    wsk->data = data;
    wsk->next = first;
 
    return wsk;
}

zamiast tego to zrób tak

template <class X, class T>
 
T *add_to_list(T *first, X data) //dodaje wartosc na poczatek listy
{
    T *wsk = new T;
    wsk->data = data;
    wsk->next = first;
 
    return wsk;
}

bo z tego co zrozumialem to masz problem z funkcja ktora przyjmuje dwa szablony tak?

0

Tak, dokładnie o to mi chodziło. Dzięki wielkie za pomoc :)

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