Szablony klas - co jest nie tak?

0
#ifndef _SZABLON
#define _SZABLON

template <typename T>
class szablon
{
    private:
        T * m_item;
        int m_rozmiar;
    public:
        szablon(int x = 1);
        ~szablon();
        
        void add(T x);
        void show(void);     
};

#endif
#include <iostream>
#include "class.h"

template <typename T>
szablon<T>::szablon(int x)
{
    m_item = new T[x];
    m_rozmiar = x;
}

template <typename T>
szablon<T>::~szablon()
{
    delete[] m_item;
}

template <typename T>
void szablon<T>::add(T x)
{
    T * temp = new T[m_rozmiar + 1];
    for (int i = 0; i < m_rozmiar; i++)
        temp[i] = m_item[i];
        
    m_item[m_rozmiar] = x;

    delete[] m_item;
    m_item = temp;
}

template <typename T>
void szablon<T>::show(void)
{
    for (int i = 0; i < m_rozmiar; i++)
        std::cout << m_item[i] << " ";
    std::cout << std::endl;
}

undefined reference to szablon<int>::szablon(int)'`
i taki bła jest przy każdej funkcji co jest nie tak??

4

Wszystko co tyczy się szablonu masz wpakować w .h
Nie ma innego sposobu.

1

Poza sposobem poleconym przez @_13th_Dragon​a możesz także wymusić utworzenie przez kompilator instancji szablonu dla konkretnych typów

// na dole pliku cpp
template class szablon<int>;
template class szablon<string>;

Wada: tylko te typy będzie można z tym szablonem używać.

Inną metodą jest zainkludowanie pliku .cpp, ale to się tak naprawdę niczym nie różni od wrzuceniu całości zawartości do pliku nagłówkowego. O ile sensowne jest rozdzielenie deklaracji od definicji, to imho lepiej je trzymać w plikach nagłówkowych o poprawnym rozszerzeniu.

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