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>