Мой вопрос заключается в том, как мы должны правильно использовать явные объявления экземпляров шаблона?
Предположим, у нас есть некоторый шаблонный класс template<class T> Foo
.
Вот мой разум, как справиться с этой функцией:
Помещаем объявление шаблона в Foo.h
файл, реализацию в Foo.inl
файл, включаем этот Foo.inl
в конец Foo.h
файла, extern template class Foo<int>;
ставим после #include "Foo.inl"
. Также мы должны использовать явное определение экземпляра шаблона, например, в файле Foo.cpp
(конечно, мы также должны включить Foo.h
в этот файл cpp).
Если мы сделаем все это, мы получим ошибку: мы не можем использовать явное определение экземпляра шаблона сразу после явного объявления экземпляра шаблона. Хорошо, давайте поместим объявление шаблона и #include "Foo.inl"
в отдельный файл Foo.hpp
и включим его в Foo.cpp
. В итоге получили вот это:
Foo.hpp
template<class T>
class Foo
{
public:
Foo();
...
};
#include "Foo.inl"
Foo.inl
template<class T>
Foo<T>::Foo() {}
Фу.ч
#include "Foo.hpp"
extern template class Foo<int>;
Foo.cpp
#include "Foo.hpp"
template class Foo<int>;
И используйте этот шаблон, как это:
test1.cpp
#include "Foo.h"
void bar()
{
Foo f;
}
Слишком много Foo, вам не кажется? Как вы с этим справляетесь?
Извините за мой английский.
ОБНОВИТЬ:
Вопрос не в явных определениях инстанцирования шаблона или методах настройки самого кода шаблона, а в использовании явного объявления инстанцирования шаблона и в "файловом аду", который получается если мы пытаемся использовать его.
*.h
и*.hpp
, потому что, если бы я оставил только файл*.hpp
и поместил в негоextern template class Foo<int>
, я не смог бы включить этот файл*.hpp
в файл*.cpp
. Вы не можете использовать явное определение экземпляра и явное объявление экземпляра в одном файле (в данном случае*.cpp
) - person Dmitry Katkevich   schedule 28.11.2016