Это означает, что все определения шаблона (шаблон функции или шаблон класса) находятся только в заголовках. Нет файла .cpp
. Есть только .h
файлы (или некоторые другие расширения, такие как .hpp
или вообще без расширения, например <vector>
, string>
и т. Д.)
Компиляторы C ++ требуют, чтобы определения шаблонов присутствовали в том же файле, в котором они объявлены. Таким образом, библиотека только для заголовка не является ни статической, ни динамической библиотекой. Его библиотека source-code означает, что вы можете увидеть реализацию в заголовках. Вы включили заголовочные файлы в свой код, который компилируется вместе с заголовками из библиотеки.
Обратите внимание на ту часть стандартной библиотеки C ++, в которой используются такие шаблоны, как <vector>
, string>
, <map>
и т. Д. - это библиотека только для заголовков.
На самом деле шаблоны (шаблоны классов и шаблоны функций) не могут быть скомпилированы в статическую или динамическую библиотеку для связи с программами. Шаблон, как говорит сам термин, шаблон; это не нормальный код; Только когда вы используете его в своем коде, передавая аргументы шаблона (который является type
или value
), компилятор генерирует скомпилируемую функцию / класс из шаблона функции / класса:
template<typename T>
struct A
{
T data;
};
struct B
{
int data;
};
Здесь A
нельзя скомпилировать в двоичный файл (статическая или динамическая библиотека), поскольку компилятор не знает, что такое T
. Но B
можно скомпилировать в двоичный файл, так как компилятор имеет полную информацию об этом.
Таким образом, вы можете прочитать фразу "шаблон класса A" , так как: A
- это шаблон для класса. A
сам по себе не класс. Но B
- это класс, а не шаблон.
Поскольку шаблон класса A
не может быть скомпилирован в статическую или динамическую библиотеку для связи с вашими программами, поэтому A
может быть доставлен только как header-only
библиотека с полным исходным кодом. Аналогично