Объявления явного создания экземпляров шаблона C++: лучшие практики

Мой вопрос заключается в том, как мы должны правильно использовать явные объявления экземпляров шаблона?

Предположим, у нас есть некоторый шаблонный класс 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, вам не кажется? Как вы с этим справляетесь?

Извините за мой английский.

ОБНОВИТЬ:

Вопрос не в явных определениях инстанцирования шаблона или методах настройки самого кода шаблона, а в использовании явного объявления инстанцирования шаблона и в "файловом аду", который получается если мы пытаемся использовать его.


person Dmitry Katkevich    schedule 28.11.2016    source источник
comment
Возможный дубликат проблемы с несколькими определениями шаблона   -  person Dusteh    schedule 28.11.2016
comment
Какой смысл в .h и .hpp, просто бросить один? Вы не можете избавиться от файла .cpp, если хотите создать его экземпляр. Вы можете избавиться от файла .inl, если у вас есть надлежащие инструменты документации, хотя это может быть плохой идеей.   -  person csiz    schedule 28.11.2016
comment
@csiz, в этом случае я создал два файла *.h и *.hpp, потому что, если бы я оставил только файл *.hpp и поместил в него extern template class Foo<int>, я не смог бы включить этот файл *.hpp в файл *.cpp. Вы не можете использовать явное определение экземпляра и явное объявление экземпляра в одном файле (в данном случае *.cpp)   -  person Dmitry Katkevich    schedule 28.11.2016
comment
Хм, кажется, у меня просто работает cpp.sh/6jbe   -  person csiz    schedule 28.11.2016
comment
@csiz, может быть, это особенности VS2013. Вот скриншот ошибки drive.google.com/open?id=0B8WIZg5ldEQaSkxTU0k5VVFVQU0.   -  person Dmitry Katkevich    schedule 28.11.2016
comment
Я скопировал ваш код в webcompiler.cloudapp.net, и он тоже работает. Извините, не знаю, чем вам здесь помочь.   -  person csiz    schedule 28.11.2016