Самый простой способ - просто переместить весь код шаблона в заголовочный файл (как описано в других ответах)
НО это не единственное решение.
Шаблон нефактические функции.
Шаблон становится функцией, когда есть экземпляр функции.Это может быть сделано неявно или явно.Каждый раз, когда функция используется, происходит неявное воплощение.Но вы также можете явно создать экземпляр функции-шаблона.
Таким образом, вы должны иметь возможность ссылаться на любую экземплярную версию функции-шаблона в вашей общей папке lib.
Заголовочный файл, поэтому мы соблюдаем одно определение.rule.
// tt.h
template<typename T>
int doStuff(Tconst &t);
Исходный файл:
// tt.cpp
#include "tt.h"
template<typename T>
int doStuff(Tconst &t)
{
return 4;
}
void plop()
{
int x = 6;
// implicit instanciation of doStuff<int>(int const&);
doStuff(x);
}
// explicit instanciation of template
template int doStuff<float>(float const&);
Если бы я скомпилировал вышеизложенное в общую библиотеку.
Тогда было бы доступно два метода doStuff ().
- doStuff (int const &) // Неявная реализация
- doStuff (float const &) // Explit instance
g ++ -shared -o tt.so tt.cpp
Теперь, если у нас есть отдельный файл, который мы связываем с общей библиотекой:
// main.cpp
#include "tt.h"
int main()
{
doStuff(5); // doStuff<int>()
doStuff(6.0f); // doStuff<float>()
}
g ++ main.cpp t.so
Компилируется нормально, хотя main не видит код шаблона.