Если у вас есть метод шаблона, его определение должно быть видно в том месте, где создается шаблон. Это означает, что в 99% случаев определение шаблона должно быть в заголовочном файле.
В некоторых случаях существует способ обойти его. Вы можете принудительно создать экземпляр шаблона для определенного типа, перечислив эти типы в файле cpp. В таком случае вы будете ограничены только этими конкретными типами.
foo.h
#include <vector>
class f{
public:
void f1();
template<typename T>
void f3(std::vector<T> &);
};
foo.cpp
#include "foo.h"
#include <iostream>
#define LOG std::cout << __PRETTY_FUNCTION__ << '\n'
void f::f1()
{
LOG;
}
template<typename T>
void f::f3(std::vector<T> &)
{
LOG;
}
template void f::f3<int>(std::vector<int> &);
template void f::f3<double>(std::vector<double> &);
main.cpp
#include "foo.h"
#include <iostream>
int main()
{
std::vector<int> bar{ 1, 3, 5, 6 };
f foo;
foo.f1();
foo.f3(bar);
return 0;
}
Демонстрационная версия
Обратите внимание, что в C ++ появится новая функция. В C ++ введены 20 модулей . Просто больше нет заголовочных файлов.