Проблема с зависимостями файлов и шаблонами в программе на C ++

Возможные дубликаты:
шаблонные функция отображается как неопределенная ссылка во время компиляции
Почему шаблоны могут быть реализованы только в файле заголовка?

Привет, у меня проблема с зависимостями в программе на C ++, которая возникает только тогда, когда я использую шаблоны. По-видимому, компилятор не может создать экземпляр шаблона для конкретного типа, и я не знаю почему.

Предположим, у меня есть эта библиотека (настоящая программа, в которой я нашел ее, намного больше, но я думаю, что она воспроизводит мою исходную проблему):

//temp.cpp file
#include "temp.hpp"

template <typename a> 
void printVector(std::vector<a> xs) {
  for_each(xs.begin(), xs.end(), [](a x) {std::cout << x << " ";});
}

void printDoubVector(std::vector<double> xs) {
  for_each(xs.begin(), xs.end(), [](double x) {std::cout << x << " ";});
}

с этим файлом заголовка:

#include <vector>
#include <algorithm>
#include <iostream>


template <typename a> void printVector(std::vector<a> xs);
void printDoubVector(std::vector<double> xs);

И этот главный файл:

#include "temp.hpp"

int main(){
  std::vector<double> foo(10,1);
  printVector(foo);
  std::cout << std::endl;
}

Когда я компилирую их с помощью этого make-файла:

CC=g++-4.5
FLAGS = -std=gnu++0x -Wall

all: test

test: temp.o main.o
    $(CC) $(FLAGS) $^ -o $@

%.o: %.cpp
    $(CC) $(FLAGS) -c $^ -o $@

У меня ошибка undefined reference to 'void printVector<double>(std::vector<double, std::allocator<double> >)'.

Конечно, если я использую printDoubVector(foo); вместо printVector(foo);, он компилируется нормально. Если все находится в одном файле, он также компилируется нормально. Я тоже пробовал делать printVector<double>(foo); безрезультатно. Очевидно, компилятор знает, что я хочу printVector<double>, но он просто не может его найти. :(

Я не понимаю этой проблемы. Раньше я без проблем использовал шаблоны в разных файлах при компиляции. :( Тем не менее, это кажется очень простым, что я должен знать на этом уровне.: /


person Rafael S. Calsaverini    schedule 02.06.2011    source источник
comment
parashift.com/c++-faq-lite/templates.html# faq-35.13   -  person Flexo    schedule 02.06.2011
comment
@Bo Я тоже думаю, что это дубликат. Пожалуйста, отметьте как дубликат, если хотите.   -  person Rafael S. Calsaverini    schedule 02.06.2011
comment
Я уже проголосовал за закрытие, но мне нужно, чтобы другие согласились. :-) Комментарий создается автоматически.   -  person Bo Persson    schedule 02.06.2011


Ответы (1)


Причина подробно описана здесь.

Короче говоря, вам необходимо предоставить полное определение в заголовочном файле, иначе компилятор не сможет создать экземпляр шаблона.

person Björn Pollex    schedule 02.06.2011
comment
Блин ... Я действительно должен это знать! Это то, что я получаю, изучая C ++ по дурацким книгам. :( - person Rafael S. Calsaverini; 02.06.2011
comment
@Rafael: вы должны были использовать один из этих. - person Björn Pollex; 02.06.2011
comment
да, я знаю ... люди сказали мне здесь, что книга, которую я прочитал, была действительно плохой. Мне казалось, что мне снова приходится изучать C ++ с нуля каждый раз, когда я наталкиваюсь на такую ​​глупую ошибку. - person Rafael S. Calsaverini; 02.06.2011