C++ Wywoływanie funkcji z szablonami

0

Witam,
Mam problem z poprawnym wykorzystaniem szablonów w implementacji listy dwukierunkowej, a dokładnie przy wywoływaniu funkcji i określaniu jej argumentów. Będę wdzięczny, gdyby ktoś podpowiedział, gdzie robię błąd oraz chociaż trochę przybliżył wykorzystanie szablonów w tym przypadku.
Za błędy w publikacji wątku z góry przepraszam.

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <windows.h>

using namespace std;

template <typename el>
    struct element_listy
{
	el dane1;
	el dane2;
    element_listy *prev=NULL;
    element_listy *next=NULL;
};

template <typename l>
    struct lista
{
    l rozmiar=0;
    element_listy<l> *first=NULL;
    element_listy<l> *last=NULL;
};

template <typename dnenkl>
void dodanie_nowego_elementu_na_koniec_listy(const dnenkl &dane1, const dnenkl &dane2, dnenkl &lista, dnenkl &nowy)
{
    clock_t czas_start=clock();
    
    nowy->dane1=dane1;
    nowy->dane2=dane2;
	nowy->next=NULL;
    if(lista.first==NULL)
    {
        nowy->prev==NULL;
        lista->first=nowy;
        lista->last=nowy;
    }
    else
    {
        nowy->prev=lista->last;
        (nowy->prev)->next=nowy;
    }
    lista->last=nowy;
    lista->rozmiar++;

    clock_t czas_stop=clock();
    double czas=(czas_stop-czas_start)/(double)CLOCKS_PER_SEC;
    cout<<"Operacja dodania nowego elementu na koniec listy zajela:"<<czas<<endl;
};

int main()
{
	srand(time(NULL));
	lista<int> *lista;
    int nr_operacji;

    do
    {
        cout<<"1 - Dodaj nowy element na koniec listy"<<endl;
        cout<<"0 - Zakocz dzialanie programu"<<endl;
        cout<<"Wybierz numer operacji: "<<endl;
        cin>>nr_operacji;

        switch(nr_operacji)
        {
        case 1:
        	element_listy<int> *nowy;
        	nowy = new element_listy<int>;
            dodanie_nowego_elementu_na_koniec_listy( (rand()%1001), ((rand()%26)+65), lista, nowy);
            
            break;
        case 2:
            break;
        }

    }while (nr_operacji!=0);

    return 0;
}
0

Czemu Masz wszystkie referencje jednego typu? Dane powinny być jakiegoś typu(szablon), a referencje do list typu struct lista.

0

Nie jestem pewien, czy dobrze rozumiem. O to chodzi? W ten sposób?

void dodanie_nowego_elementu_na_koniec_listy(const int &dane1, const char &dane2, struct lista<int> &lista, struct element_listy<int> &nowy)

Nie miałem wcześniej do czynienia z szablonami i dlatego błądzę w tym temacie.
Po wprowadzeniu powyższej poprawki i zamianie w funkcji wszystkich "->" na "." oprócz tej jednej linii:

(nowy.prev)->next=nowy;

Dalej mam takie błędy:
In function 'int main()':
[Error] no matching function for call to 'dodanie_nowego_elementu_na_koniec_listy(int, int, lista<int>&, element_listy<int>&)'
[Note] candidate is:
[Note] template<class dnenkl="dnenkl"> void dodanie_nowego_elementu_na_koniec_listy(const int&, const char&, lista<int>&, element_listy<int>&)
[Note] template argument deduction/substitution failed:
[Note] cannot convert 'lista' (type 'lista<int>*') to type 'lista<int>&'

1

Pomieszanie z poplątaniem:), Poczytaj coś o szablonach; append wystarczy, że będzie przyjmować dane1, dane2 i wskaźnik do listy (kodu funkcji nie czytam, zakładam, że Wiesz co Robisz), wszystkie elementy mają miec ten sam parametr typu (lista przyjmuje parametr typu elementu):

template <typename E>
    struct element_listy
{
    E dane1;
    E dane2;
    element_listy *prev=NULL; // ??
    element_listy *next=NULL; // ??
};

template <typename E>
    struct lista
{
    size_t rozmiar = 0;
    element_listy<E> *first=NULL;
    element_listy<E> *last=NULL;
};

template <typename E>
void append(E &data1, E &data2, struct lista<E> &head) {
	/*....   */
}
0

Widzę niezainicjowany wskaźnik do listy lista<int> *lista; , która nigdzie nie jest utworzona, później tworzysz tylko nowe elementy typu element_listy<int>.

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