Скажите, что я делаю не так? Маленькая прога:
1. Файл xxx.h
#ifndef XXX_H
#define XXX_H
template <class TYPE>
class xxx {
public:
xxx();
~xxx();
TYPE x[10];
int y;
};
#endif2. Файл 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 (хотя это вряд ли имеет значение).
Заранее спасибо!
Есть два решения этой проблемы:
1) нужно описывать шаблон в заголовочном файле _ПОЛНОСТЬЮ_
2) если компиллятор поддерживает директиву С++ export, то методы шаблона нужно определять как:#include "xxx.h"
export template <class TYPE> xxx<TYPE>::xxx()
{ ... }export template <class TYPE> xxx<TYPE>::~xxx()
{ ... }P.S. В .h-файле директива export не используется.
Если компиллятор не поддерживает директиву export, то остаётся только вариант 1)
Спасибо. Действительно всё заработало. Вот только я не пойму: это что, глобальный глюк что ли? Такого же по идее быть не должно. Ни в одной книжке по С++ я такого не встречал.
>Ни в одной книжке
>по С++ я такого не
>встречал.См.
The C++ Programming Language
Bjarne Stroustrupили переводное издание за прошлый год (хоть в мягкой хоть в жёсткой обложке).
Глава "Шаблоны", пункт "Организация исходного кода"