Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Templates  (Прочитано 3999 раз)
0 Пользователей и 1 Гость смотрят эту тему.
acc15
Гость
« : 19-11-2005 06:52 » 

странная проблемма с темплэйтами... делаю один .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;
}
« Последнее редактирование: 19-11-2005 06:56 от acc15 » Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-11-2005 07:50 » 

Для того, чтобы компилятор смог сгенерировать тела метов инстанциированного класса, необходимо, чтобы текст шаблона был видим в точке инстанциирования шаблона.  Перенеси все методы в заголовочный файл.

Для примера посмотри заголовки STL -- iostream, string, etc.  В них содержатся полные реализации стандартных шаблонов.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines