Napisalem szablon listy ktory nie chce sie linkowac w builder 5. Zadna funkcja ze składowej szablonu nie jest linkowana:

[Linker Error] Unresolved external 'UAObject<int>::~UAObject<int>()' referenced from H:\CPPP\UNIDYNALLOC\UNIT1.OBJ
[Linker Error] Unresolved external 'UAObject<int>::UAObject<int>()' referenced from H:\CPPP\UNIDYNALLOC\UNIT1.OBJ
[Linker Error] Unresolved external 'UAList<int>::add(int *)' referenced from H:\CPPP\UNIDYNALLOC\UNIT1.OBJ

Kod:

template< class UATYPE >
class UAItem
{
public:
   UAItem< UATYPE > *next;
   UATYPE data;

   inline UAItem(){next=NULL;};
};

//----------------------------------------------------

template< class UATYPE >
class UAObject
{
private:
   unsigned Count;
   UAItem< UATYPE > *begin_ptr;

   UAItem< UATYPE > *get_item(const unsigned);

public:
   inline UAObject(){ Count=0; begin_ptr=NULL; };
   inline ~UAObject(){ clear(); };
   inline unsigned size() const { return Count; };

   void invert();
   void clear();
};
template< class UATYPE >
class UAList : public UAObject< UATYPE >
{
private:
public:

   UATYPE *add(UATYPE*);
   bool erase(const unsigned);
   bool erase(unsigned,const unsigned);
   bool insert(const unsigned,UATYPE*);
   inline UATYPE *begin();
   UATYPE *end();
   UATYPE *get(const unsigned);
   void pack();
};
//--------------------------

template< class UATYPE >
UAItem< UATYPE > *UAObject< UATYPE >::get_item(const unsigned i)
{
   unsigned z;
   UAItem< UATYPE > *ui = begin_ptr;
   if(i >= Count)
      return 0x0;
   for(z=0; z<i; z++)
   {
      ui = ui->next;
   }
   return ui;
}

template< class UATYPE >
void UAObject< UATYPE >::invert()
{
   UAItem< UATYPE > *b, *ui, *ui2;
   unsigned i=Count-1;

   if(Count<2)
      return;

   b = get_item(Count-1);
   ui2 = b;
   while(i>0)
   {
      ui = get_item(i-1);
      b->next = ui;
      b = b->next;
      i--;
   }
   begin_ptr = ui2;
}

template< class UATYPE >
void UAObject< UATYPE >::clear()
{
   UAItem< UATYPE > *ui, *ui2;
   ui = begin_ptr;
   while(ui)
   {
      ui2 = ui->next;
      delete ui;
      ui = ui2;
   }
   begin_ptr = NULL;
   Count = 0;
}

//----------------------------------------------------------------------
//-------------------------- UAList ------------------------------------
//----------------------------------------------------------------------

template< class UATYPE >
UATYPE *UAList< UATYPE >::add(UATYPE *data)
{
   UAItem< UATYPE > *ui;
   if(begin)
   {
      ui = get_item(Count-1);
      ui->next = new UAItem;
      ui = ui->next;
   }
   else
   {
      begin_ptr = new UAItem;
      ui = begin_ptr;
   }
   ui->data = *data;
   ui->next = 0x0;
   Count++;
   return &(ui->data);
}

template< class UATYPE >
bool UAList< UATYPE >::erase(const unsigned i)
{
   UAItem< UATYPE > *ui, *ui2;
   if(i >= Count)
      return 0;
   else if(Count == 1)
   {
      delete begin_ptr;
      begin_ptr = 0x0;
      Count = 0;
      return 1;
   }
   if(i==0)
   {
      ui = begin_ptr->next;
      delete begin_ptr;
      begin_ptr = ui;
   }
   else
   {
      ui = get_item(i-1);
      ui2 = get_item(i+1);
      delete ui->next;
      ui->next = ui2;
   }
   Count--;
   return 1;
}

template< class UATYPE >
bool UAList< UATYPE >::erase(unsigned i,const unsigned i2)
{
   UAItem< UATYPE > *ui, *ui2;
   if(i>=Count || i2<=i || i2>=Count)
      return 0;

   if(i==0)
   {
      ui = begin_ptr;
      begin_ptr = get_item(i2+1);
   }
   else
   {
      ui = get_item(i-1);
      ui2 = ui->next;
      ui->next = get_item(i2+1);
      ui = ui2;
   }

   while(i<i2)
   {
      ui2 = ui->next;
      delete ui;
      ui = ui2;
      i++;
      Count--;
   }
}

template< class UATYPE >
bool UAList< UATYPE >::insert(const unsigned i,UATYPE *data)
{
   UAItem< UATYPE > *ui, *ui2;
   ui = get_item(i);
   if(ui==0x0)
      return 0;
   ui2 = get_item(i+1);
   ui->next = new UAItem;
   ui = ui->next;
   ui->data = data;
   ui->next = ui2;
   Count++;
   return 1;
}

template< class UATYPE >
UATYPE *UAList< UATYPE >::begin()
{
   return &(begin_ptr->data);
}

template< class UATYPE >
UATYPE *UAList< UATYPE >::end()
{
   if(Count==0)
      return 0x0;
   else if(Count==1)
      return begin();
   return &(Get(Count-1)->data);
}

template< class UATYPE >
UATYPE *UAList< UATYPE >::get(const unsigned i)
{
   UAItem< UATYPE > *ui = get_item(i);
   if(ui)
      return ui->data;
   return 0x0;
}

template< class UATYPE >
void UAList< UATYPE >::pack()
{
   UAItem< UATYPE > *ui = begin, *ui2;
   while(ui)
   {
      if(ui->data==0x0)
      {
         ui2 = ui->next;
         delete ui;
         ui = ui2;
      }
      else
         ui = ui->next;
   }
}

</b>