2014-03-04 7 views
2

Я искал способ разделить объявление класса класса и определение. Мне было рекомендовано решение, которое включает в себя охранники как в Header.h, так и в Source.cpp и Header.h, включая Source.cpp после #endif из include guard.Template Class Source File

Я думал, что компоновщик будет жаловаться на повторное определение (несколько символов?) Класса шаблонов, но это почему-то не так и почему нет?

Не приводит ли это к дублированию кода в двоичном результате? Каждый раз заголовок включен в исходный файл, также включается определение того же класса.

ответ

1

Для нормальных символов это действительно приведет к двойным определениям. Тем не менее, шаблоны обрабатываются отчетливо и, как если бы они имели внутреннюю связь. Следовательно, нет двойного определения.

Тем не менее, это плохая идея поместить реализацию в файлы cpp - это смутит множество цепей инструментов, которые предполагают, что такие файлы должны быть скомпилированы. Переименуйте файлы на ipp - это часто используется для таких файлов реализации шаблона.

2

Объектный файл, созданный путем компиляции каждого файла CPP, будет содержать дубликаты. Эти дубликаты удаляются компоновщиком.

1
  • Если шаблон создан с использованием разных параметров, он создает разные классы. Так что это не дублирование.
  • Если это тот же параметр, компоновщик достаточно умен, чтобы найти дубликаты. На самом деле для соответствующего компилятора обязательно их найти.
0

Вы должны включить защитные элементы заголовка также в файл реализации. Не используйте .cpp в любом случае, это пугает. Например, я помещаю объявление в header.h и реализацию в header-inl.h.

1

Символы не размножаются, поскольку функции шаблона являются встроенными.

Включая .h в .cpp-файл, а затем содержащий файл .cpp в файле .h отлично работает, поскольку файлы .h имеют защиту, поэтому заголовочный файл не включается 2 раза.

В целом, это не очень хорошая идея использовать файлы .cpp для этого, так как это очень запутывает, и в двух словах это то же самое, что и просто реализация в файле .h. Вы можете создать отдельный .hpp-файл с индексом _Impl.hpp для хранения реализаций.