Нельзя разделить шаблонные функции на файл .cpp и заголовок. Когда класс шаблона написан и скомпилирован, он фактически не «компилируется» в обычном смысле. Вместо этого он компилируется только при назначении ему параметра шаблона. Таким образом, каждый раз, когда вы делаете ранее не сделанное объявление Foo<Bar>
в своем коде, вы фактически требуете, чтобы компилятор генерировал целый новый класс. Без знания того, как реализовать весь этот новый класс, он не сможет скомпилировать новый класс. Вот почему ваш компилятор выкладывает ошибки, которые вы видите.
Чтобы быть более информативным. Давайте предположим, что я создаю файл с именем "bleah.h"
template<typename T>
struct Foo{ T value; }
и теперь у меня есть это в "Yuck.h":
#include "bleah.h"
Foo<int> something; //compiler stops here and compiles a new class for Foo<int>
Foo<int> another; //compiler doesn't need to generate a new Foo<int>, already done
Foo<double> oh; //compiler needs to make a new class Foo<double>
Так как у меня здесь есть заголовок, мне нужна вся эта информация в заголовке для компиляции различных шаблонных версий "Foo".