nierozpoznany zewnętrzny symbol "public: __thiscall..."

0

Przy wywołaniu szablonu tablicy wyskakuje mi taki komunikat:
error LNK2019: nierozpoznany zewnętrzny symbol "public: __thiscall TArray<float>::TArray<float>(unsigned int)" (??0?$TArray@M@@QAE@I@Z) przywołany w funkcji _main

Poczytałem coś o tym komunikacie, że być może nie zdefiniowałem jakiegoś konstruktora który był w pliku nagłówkowym, lecz coś takiego na pewno tu mi się nie mogło przytrafić.
Także prosiłbym o jakieś wytłumaczenie co w kodzie jest źle.

plik .h

template <typename T> class TArray
{
private:
	unsigned m_nSize;
	T* m_pArray;
public:
	explicit TArray(unsigned nSize = 5);
	TArray(const TArray& array);
	T& operator[](unsigned uIndex) { return (uIndex < m_nSize) ? m_pArray[uIndex] : m_pArray[0]; }
	T& operator=(const TArray& array);
	int size() const { return m_nSize; }
	~TArray() {delete[] m_pArray; }
};

plik .cpp (sam konstruktor ten pierwszy, nagłówkowy oczywiście dołączony)

template<typename T>
TArray<T>::TArray(unsigned nSize) : m_nSize(nSize)
{
	m_pArray = new T[nSize];
}

wywołuję:

TArray<float> array(4);
1

Szablon, czyli przepis na klasę, deklarujesz i definiujesz w nagłówku. Nie używasz do niego plików .cpp. Czyli w Twoim przypadku - przenieś definicje konstruktora do nagłówka i usuń plik .cpp.

1

@rudnev1922: dyskusje na temat nie powinne być przeprowadzane w komentarzach

Ale ogólnie przyjęte jest, żeby wszystko pisać w nagłówkowych?

Jeśli mowa o klasach, to, tak jak pisał @Juhas w komentarzu - tak. W przypadku gdy metoda szablonu jest trochę dłuższa, używa się jeszcze plików ipp/tpp i inkluduje się je na końcu nagłówka, więcej o tym na Stack Overflow.

To czego nie rozumiesz, to to, że kompilator używa plików .cpp do stworzenia pojedyńczej jednostki translacyjnej - pliku .o (sam krok stworzenia fizycznego pliku można pominąć, ale o tym kiedy indziej), który potem jest linkowany z innymi jednostkami przez linker. Szablon to nie pełnoprawny kod, to dopiero przepis na kod tworzony gdzie indziej. Kompilator nie zbuduje Ci pliku .o z definicją szablonu przez co linker nie może znaleźć implementacji Twojego konstruktora.

Nagłówek zaś sam w sobie nie jest kompilowany do plików .o, jest dołączany do innych plików przez preprocesor.

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