Шаблоны в .h и .cpp файлах
От: Tora-Bora  
Дата: 25.06.03 07:33
Оценка:
Вот я создаю шаблон, в .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 файлах
От: Вадим Никулин Россия Здесь
Дата: 25.06.03 07:45
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>Вот я создаю шаблон, в .h и .cpp:


TB>Что не нравится?!


ИМХО, надо все создавать в *.h файле. Компилятору ведь надо как-то инстанцирование делать.
Re: Шаблоны в .h и .cpp файлах
От: Bell Россия  
Дата: 25.06.03 07:55
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

Воспользуйся поиском. Эта тема всплывает очень часто, и написано по этому поводу уже очень много.
Любите книгу — источник знаний (с) М.Горький
Re: Шаблоны в .h и .cpp файлах
От: Lorenzo_LAMAS  
Дата: 25.06.03 08:21
Оценка:
Здравствуйте, Tora-Bora, Вы писали:

TB>Вот я создаю шаблон, в .h и .cpp:


Купи КОМО и вперед! Только export не забывай писать.
Of course, the code must be complete enough to compile and link.
Re: Шаблоны в .h и .cpp файлах
От: Всеволод Россия  
Дата: 25.06.03 08:41
Оценка: 3 (1)
Здравствуйте, Tora-Bora, Вы писали:

TB>Вот я создаю шаблон, в .h и .cpp:


Посмотри Страуструпа пункт 13.7
Чтобы избежать ошибок линковки нужно либо включать определения шаблонов в каждую единицу трансляции (что довольно громоздко и чревато ошибками), либо включать только объявления шаблонов, а их определения иметь в отдельном cpp-файле (как ты и сделал).
При последнем способе для того, чтобы определение шаблона было доступно компилятору, оно должно быть обявлено с квалификатором export.
Проблема заключается в том, что не все компиляторы поддерживают экспорт шаблонов. В частности — Microsoft.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.