Definicje szablonów muszą być znane w czasie kompilacji. Tzn. nie mogą być w w pliku .cpp. No chyba, że jakoś inaczej to rozwiążesz. Możesz zostawić definicje tych wszystkich metod w pliku cpp, ale zaincludować go na końcu headera (pod definicją Queue po prostu). To powinno załatwić sprawe. Ja do takiego rozwiązania osobiście nic nie mam, ale opinie są różne - niektórzy mówią że brzydkie, psuje czytelność i wymaga includowania pliku cpp co jest nieco dziwne.
Nie zagłębiałem się specjalnie w kod, ale zauważyłem kilka rzeczy które być może warto poprawić:
- Node powinna być zadeklarowana wewnątrz definicji Queue (i najlepiej jako private). Nie ma powodu, żeby Node było znane dla ogółu.
- Duplikacja kodu w konstruktorach. Zamiast
template <class T2>
Queue<T2>::Queue() : MAX_SIZE(10)
{
front = rear = nullptr;
}
template <class T2>
Queue<T2>::Queue(int qsize) : MAX_SIZE(qsize)
{
front = rear = nullptr;
}
możesz skorzystać z delegowania konstruktorów:
template <class T2>
Queue<T2>::Queue() : Queue(10) {}
template <class T2>
Queue<T2>::Queue(int qsize) : MAX_SIZE(qsize)
{
front = rear = nullptr;
}
- Nie inicjalizujesz membera size
No i na przyszłość: napisz w pytaniu jaki błąd jest wyrzucany przez kompilator.
PS: błąd kompilacji to zdecydowanie nie jest najgorszy problem :D IMO hierarchia wygląda tak (od najlżejszego):
- błędy kompilacji
- błędy linkera
- kompiluje się, ale się wykrzacza z powodu naruszenia pamięci
- wykrzacza się z powodu przepełnienia stosu
- crash wewnątrz sterownika
- wewnętrzny błąd kompilatora (compiler internal error - cholernie rzadka rzecz)
:D