Шаблоны в .h и .cpp файлах
Вот я создаю шаблон, в .h и .cpp:
STACK.h:
#ifndef STACK_H
#define STACK_H
template<class Item>
class STACK
{
Item *s;
int N;
public:
STACK(int maxN)
{ s = new Item[maxN]; N=0; }
int empty() const;
void push(Item item);
Item pop();
};
#endif
STACK.cpp:
#include "stack.h"
template <class Item>
int STACK<Item>::empty() const
{
return N == 0;
}
template <class Item>
void STACK<Item>::push(Item item)
{
s[N++] = item;
}
template <class Item>
Item STACK<Item>::pop()
{
return s[--N];
}
а вот файл
main.cpp:
#include "stack.h"
int main(int argc,char *argv[])
{
char *a = argv[1]; int N = strlen(a);
STACK<char> save(N);
//.....
return 0;
}
пишет:
Linking...
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall STACK<char>::push(char)" (?push@?$STACK@D@@QAEXD@Z)
main.obj : error LNK2001: unresolved external symbol "public: char __thiscall STACK<char>::pop(void)" (?pop@?$STACK@D@@QAEDXZ)
Debug/ATD.exe : fatal error LNK1120: 2 unresolved externals
Что не нравится?!
Re: Шаблоны в .h и .cpp файлах
Здравствуйте, Tora-Bora, Вы писали:
TB>Вот я создаю шаблон, в .h и .cpp:
TB>Что не нравится?!
ИМХО, надо все создавать в *.h файле. Компилятору ведь надо как-то инстанцирование делать.
Re: Шаблоны в .h и .cpp файлах
От:
Bell
Дата: 25.06.03 07:55
Оценка:
Здравствуйте, Tora-Bora, Вы писали:
Воспользуйся поиском. Эта тема всплывает очень часто, и написано по этому поводу уже очень много.
Любите книгу — источник знаний (с) М.Горький
Re: Шаблоны в .h и .cpp файлах
Здравствуйте, Tora-Bora, Вы писали:
TB>Вот я создаю шаблон, в .h и .cpp:
Купи КОМО и вперед! Только export не забывай писать.
Of course, the code must be complete enough to compile and link .
Re: Шаблоны в .h и .cpp файлах
Здравствуйте, Tora-Bora, Вы писали:
TB>Вот я создаю шаблон, в .h и .cpp:
Посмотри Страуструпа пункт 13.7
Чтобы избежать ошибок линковки нужно либо включать определения шаблонов в каждую единицу трансляции (что довольно громоздко и чревато ошибками), либо включать только объявления шаблонов, а их определения иметь в отдельном cpp-файле (как ты и сделал).
При последнем способе для того, чтобы определение шаблона было доступно компилятору, оно должно быть обявлено с квалификатором export .
Проблема заключается в том, что не все компиляторы поддерживают экспорт шаблонов. В частности — Microsoft.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить