Реализация класса шаблона должна быть доступна, когда шаблон создается в вызывающем коде.Следовательно, простое решение - поместить определение и реализацию класса в один заголовочный файл.Конечно, есть и другие решения.Решения, которые я мог найти с Google, в основном уже суммированы в http://blog.ethanlim.net/2014/07/separate-c-template-headers-h-and.html, который предлагает:
- Вся реализация в заголовочный файл
- Явное создание шаблона в реализации (* .cpp)
Вариант первого, который я видел, используют другие люди, и я использовал себя, чтобы создать файл заголовка для реализации myTemplateClass_impl.h, который включен из другого заголовка myTemplateClass.часЯ всегда думал, что это рекомендуемый способ сделать это, но при поиске в Google я был удивлен, что не смог найти нигде описанную эту технику.Теперь у меня есть одна проблема с этим методом: он нарушает vscode intellisense (или другую поддержку IDE C ++), потому что myTemplateClass_impl.h не является самодостаточным.
Теперь есть способ сделать его дружественным по отношению к IDE, но этонемного свернутый:
myTemplateClass.h
#ifndef MYTMPCL_H
#define MYTMPCL_H
namespace tmpcl {
template <typename T> class TmpCL
{
...
}
} // namespace tmpcl
#include "myTemplateClass_impl.h"
#endif // MYTMPCL_H
myTemplateClass_impl.h
#ifndef MYTMPCL_IMPL_H
#define MYTMPCL_IMPL_H
#include "myTemplateClass.h"
namespace tmpcl {
// implementation
template <typename T> TmpCL::...
} // namespace tmpcl
#endif // MYTMPCL_IMPL_H
Теперь не имеет значения, какой из двух файлов включен.Они оба расширяются до одного и того же кода, и vscode intellisense рад.Этот дизайн хорош?
Спасибо.
Также я был удивлен, что не смог найти рекомендации о том, как это сделать, в основных рекомендациях C ++ на https://isocpp.org/