Lista jednokierunkowa a template

0
#include <iostream>
#include <string>
#include <vector>
#include <cmath>

using namespace std;


template <typename T>
class Lista
{
   public:
      struct Item
      {
         T wartosc;
         Item *next;
      };
      Item *first;
   public:
      Lista();
      ~Lista();
      Lista<T> & operator<<(T i);
};

template <typename T>
Lista<T>::~Lista()
{
   Item *element = first;
   while(element)
   {
      Item *nastepny = element->next;
      delete element;
      element = nastepny;
   }
}

template <class T> Lista<T> & Lista<T>::operator<<(T i)
{
    Item *nowy = new Item;
    nowy->wartosc = i;
    nowy->next = NULL;

    Item *tmp = first;
    while(tmp->next != NULL)
    {
        tmp = tmp->next;
    }
    tmp->next = nowy;
    
    return *this;
}

int main()
{
   Lista<int> L1();
   
   L1<<2;

   cin.get();
   cin.get();
   return 0;
}

Czemu instrukcja dodania 2 do listy kończy się niepowodzeniem?

0

Nie tyle "kończy się niepowodzeniem", co "nie kompiluje się". Po pierwsze:

Lista<int> L1();
//           ^^

Nawiasy powodują, że nie tworzysz obiektu klasy Lista<>. Prawidłowo powinieneś zrobić to bez nawiasów, czyli:

Lista<int> L1;

Po drugie: brak definicji konstruktora -- jest tylko deklaracja. Aktualnie nie można utworzyć obiektu klasy Lista<>.

Po trzecie: w metodzie operator<< powinieneś dodatkowo sprawdzać, czy pole first nie jest NULL, zamiast od razu dobierać się do first->next.

Po czwarte: deklaracja struktury Item i pola first powinny być w sekcji private, ale to może być tylko twoje przeoczenie.

Po piąte (ale to już zrzędzenie): generyczną listę implementuje całkiem nieźle STL. ;)

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