LINUX.ORG.RU

Проблема с шаблоном класса.


0

0

Скажите, что я делаю не так? Маленькая прога: 1. Файл xxx.h #ifndef XXX_H #define XXX_H template <class TYPE> class xxx { public: xxx(); ~xxx(); TYPE x[10]; int y; }; #endif

2. Файл xxx.cpp #include "xxx.h" template <class TYPE> xxx<TYPE>::xxx() { ... } template <class TYPE> xxx<TYPE>::~xxx() { ... }

3. Файл main.cpp #include "xxx.h" typedef xxx<int> xxxint; int main(int argc, char *argv[]) { xxxint l; return EXIT_SUCCESS; }

На это дело компилятор выдаёт: main.o: In function `main': undefined reference to `xxx<int>::xxx(void)' undefined reference to `xxx<int>::~xxx(void)' undefined reference to `xxx<int>::~xxx(void)' Я чего-то не въеду. При использовании шаблонов надо какую-то опцию дополнительную компилятору прописывать? Помогите, пожалуйста. Я в растерянности. Не знаю даже с чего начинать, чтобы найти ошибку. У меня FreeBSD 4.4. Работаю в Kdevelop (хотя это вряд ли имеет значение). Заранее спасибо!


Проблема тут заключается в конкретизации шаблона (она подробно описана в книге С++ Вводный курс стр. 770): Если реализация функции члена шаблона отделена от ее описания, т.е. вынесена в source файл, шаблон или конктретно эта функция должны быть объявлены с ключевым словом export. (так называемая модель компиляции с разделением). Однако большинство компиляторов это не поддерживают, а в частности мой gcc-3.0.3 сообщает что отсутствует ключевое слово export. Так что выход один - осуществлять реализацию в том файле, где описан шаблон. Я по крайней мере делаю именно так. Если очень интересно изучи "Модель компиляции шаблонов в С++".

Кстати, встречный вопрос - Как заставить KDevelop понимать кирилические шрифты. Треба комментарии на руском писать.

ASm
()

2David: резюмируя вышесказанное, на сегодняшних компиляторах ты делаешь не так то, что пытаешься поступить как с обычными функциями, то-есть прототип в .h, код в .cc с шаблонами так не получится, на данном этапе можно просто свалить все из .cpp в .h например в xxx.h: #include "xxx.c" :) то-есть компилятору должен быть виден код в месте использования, чтоб тот встроился например.

HTH

anonymous
()

При очень большой необходимости избавиться от этого можно, явно инстанцировав шаблон в том месте, где лежит его реализация. То есть в файле xxx.cpp даем объявление

template class xxx <int>;

после чего реализация соответствующих методов попадает в объектый файл xxx.o, и редактор связей все успешно линкует.

Это идеологически неверный способ (поскольку уже при написании xxx.cpp нам придется знать, с какими параметрами будет использоваться наш шаблон), но на практике работает.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.