Potrzebuję zrobić szablon klasy, żeby nie robić wielu identycznych klas różniących się typem danych.
Utworzyłem dwie testowe klasy:
szablontest1.h
#ifndef SZABLONTEST1_H
#define SZABLONTEST1_H
template <class T>
class SzablonTest1
{
private:
T Buf[10];
public:
SzablonTest1();
void Wczytaj(int N, T Val);
T Pobierz(int N);
};
#endif // SZABLONTEST1_H
szablontest1.cpp
#include "szablontest1.h"
template <class T>
SzablonTest1<T>::SzablonTest1()
{
}
template <class T>
void SzablonTest1<T>::Wczytaj(int N, T Val)
{
Buf[N] = Val;
}
template <class T>
T SzablonTest1<T>::Pobierz(int N)
{
return Buf[N];
}
szablontest2.h
#ifndef SZABLONTEST2_H
#define SZABLONTEST2_H
template <class T>
class SzablonTest2
{
private:
T Buf[10];
public:
SzablonTest2()
{
}
void Wczytaj(int N, T Val)
{
Buf[N] = Val;
}
T Pobierz(int N)
{
return Buf[N];
}
};
#endif // SZABLONTEST2_H
szablontest2.cpp
#include "szablontest2.h"
Wiadomo, że prawidłowo, to w pliku .h podaje się pola klasy i deklaracje metod, a w pliku .cpp implementuje się metody. Używam QtCreator z kompilatorem MinGW. Dla zwykłych klas nie ma problemu, natomiast do szablonu jest problem z kompilacją.
Próbuję skompilować taki kod.
SzablonTest1<int> ST1;
ST1.Wczytaj(0, 27);
cout << ST1.Pobierz(0) << endl;
SzablonTest2<int> ST2;
ST2.Wczytaj(0, 27);
cout << ST2.Pobierz(0) << endl;
Jeżeli w pliku zrobię include szablontest1.h i szablontest2.h, to przy metodach z SzablonTest1 pojawia się błąd "undefined reference to `SzablonTest1<int>::SzablonTest1()'", podobnie dla wszystkich 3 metod.
Jak zrobię include szablontest1.cpp i szablontest2.h, co jest co najmniej dziwne, bo prawidłowo, to się dołącza pliki .h, a nie .cpp, to program kompiluje się i działa poprawnie.
Gdzie jest błąd i jak prawidłowo utworzyć szablon klasy SzablonTest1 tak, że po include pliku .h program kompiluje się i działa poprawnie?