странная проблемма с темплэйтами... делаю один .h и один .cpp в хэдере все как полагается: описание темплэйтного класса в самом (.cpp) все функции, конструктор, деструктор, и т.д. Проблемма в том что линковщик не видит этих функций (описание в хэдере видит а функций нету). Если перенести описание в (.cpp) файл и использовать #include "some.cpp" тогда всё работает...
Сам (.cpp) файл компилится и (.obj) выходит... но то что в нём есть функции класса линковщик не видит...
вот содержимое файлов
Описание (Container.h)
template <class T> class Container
{
T *buf;
unsigned int size;
public:
Container();
~Container();
bool Add(const T element);
bool Delete(const unsigned int index);
bool SetLength(const unsigned int newLength);
unsigned int GetLength() const;
bool Get(const unsigned int index, T &element) const;
};
Собственно код(Container.cpp):
#include <libs/container.h>
#include <malloc.h>
template <class T> Container<T>::Container()
{
buf = 0;
size = 0;
}
template <class T> Container<T>::~Container()
{
if (buf) free(buf);
}
template <class T> bool Container<T>::Add(const T element)
{
if (!buf)
{
buf = (T*) malloc(sizeof(T));
if (!buf) return false;
*buf = element;
size = 1;
return true;
} else {
buf = (T*) realloc(buf,sizeof(T)*size+1);
if (!buf)
{
size = 0;
return false;
}
size++;
buf[size-1] = element;
return true;
}
}
template <class T> bool Container<T>::Delete(const unsigned int index)
{
if (index >= size || size==0) return false;
size--;
if (!size)
{
free(buf);
return true;
}
unsigned int i;
for (i=index;i<size-1;i++)
buf[i]=buf[i+1];
if ((buf = (T*) realloc(buf,size)) == 0)
{
size = 0;
return false;
}
else
return true;
}
template <class T> bool Container<T>::SetLength(const unsigned int newLength)
{
size = newLength;
if (!size && buf) free(buf);
buf = (T*) realloc(buf,size);
if (!buf)
{
size = 0;
return false;
} else
return true;
}
template <class T> unsigned int Container<T>::GetLength() const
{
return size;
}
template <class T> bool Container<T>::Get(const unsigned int index, T &element) const
{
if (index >= size || size==0) return false;
element = buf[index];
return true;
}