Мне кажется, что это неправильный способ разделения кода..h
означает заголовок и .hpp
для C ++ заголовок обычно.Помещение определений шаблонов в .hpp
, в то время как другой код в .h
, кажется, злоупотребляет расширением файла.
Код шаблона обычно все пишется в одном заголовке вместе с объявлением шаблона или в другом заголовке, который также может быть специально добавлен с суффиксом, таким как .tcc
или что-то еще, и затем включается в заголовок, в который помещаются объявления шаблонаНо на самом деле, расширение файла не имеет значения, если вы последовательны в своем проекте.
Исключения составляют случаи, когда вы используете явные экземпляры и точно знаете, какие именно экземпляры вам понадобятся.Представьте, что у вас есть шаблон и два его экземпляра:
template<typename T>
struct SymbolTable {
T *lookup();
// ...
};
template struct SymbolTable<GlobalSym>;
template struct SymbolTable<LocalSym>;
Вам не нужно помещать определение lookup
и другие в заголовок.Вы можете поместить их все в файл .cpp
вместе с двумя явными директивами создания экземпляров.
Последний вопрос, о котором вы спрашиваете, касается другой темы: явные специализации.Я рекомендую вам сделать отдельный вопрос об этом.В двух словах, явные определения специализации, где все аргументы шаблона имеют конкретные значения / типы, должны быть помещены в файл .cpp
, но их объявления необходимо поместить в заголовок (чтобы сообщить другим, что эти определенные члены являются специализированными).