2013-09-15 3 views
0

У меня есть две ветви в моей реализации LinkedList. Мастер - это простой, который обслуживает только целые типы данных. В то время как шаблоны _templates разработаны с шаблонами для предоставления услуг любому типу данных.Компиляция шаблона

Мой хозяин филиал компилирует прекрасно с этим:

g++ -0 t1 main.cpp LinkedList.cpp Node.cpp 

С другой стороны, когда я пытаюсь скомпилировать свою _templates ветвь с тем же (я реализация изменилось в этой отрасли с шаблонами):

g++ -0 t1 main.cpp LinkedList.cpp Node.cpp 

Я получаю ошибку Linking:

undefined reference to `LinkedList<int>::LinkedList()' 
undefined reference to `LinkedList<int>::~LinkedList()' 

и просто совершенно ясно, мой конструктор в _templates ветви

template <class T> 
LinkedList<T>::LinkedList() { 

    head = 0; 
    tail = 0; 
} 
+0

Я не думаю, что это не имеет ничего общего с git, если честно. Если вы успешно сменили филиал, все работает должным образом. Вам нужно проверить, почему ваш компилятор не находит LinkedList – bitoiu

+0

Ваш шаблон конструктора находится в заголовке, правильно? – Mat

+1

См. [Этот вопрос] (http://stackoverflow.com/q/495021/1782465). – Angew

ответ

1

При использовании шаблонов, вся ваша реализация должна быть видна все файлы, которые реализуют его в любое время. т. е. если у вас есть объявление класса внутри заголовка, определение также должно быть «внутри» этого заголовка (см. ниже).

Это связано с тем, что компилятор не может знать, какие типы могут его использовать и, следовательно, не может зарезервировать память для этого типа (подумайте, попытался ли он сделать LinkedList для каждого типа когда-либо, в мире недостаточно памяти для этого!). Из-за этого класс определенного типа определяется только когда-либо, только когда вы решите создать его в своем теле кода. Если вы никогда не используете класс, это будет только текст, и размер вашей программы не будет больше.

Есть несколько трюков для скрытия вашей реализации внутри заголовка, например, размещение их в файле с именем LinkedList.tem или LinkedList.tcc и т. Д., А затем в нижней части вашего файла заголовка: #include "LinkedList.tem". GCC использует расширение tcc из того, что я видел.

Смежные вопросы