Возможные дубликаты:
шаблонные функция отображается как неопределенная ссылка во время компиляции
Почему шаблоны могут быть реализованы только в файле заголовка?
Привет, у меня проблема с зависимостями в программе на 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>
, но он просто не может его найти. :(
Я не понимаю этой проблемы. Раньше я без проблем использовал шаблоны в разных файлах при компиляции. :( Тем не менее, это кажется очень простым, что я должен знать на этом уровне.: /