Здравствуйте, Shmj, Вы писали:
S>Он должен быть целиком и полностью определен в заголовочном файле — нельзя разнести декларацию и дефиницию, как с обычной функцией или классом.
Вот это твое заблуждение, обусловленное недостатком знания языка. Определение шаблонов в заголовочных файлах необходимо только для неявного (implicit) инстанцирования. Но, помимо неявного, есть еще и явное инстанцирование (
explicit instantiation). Шаблонные сущности (шаблоны функций и функции-члены шаблонных классов) можно не только определять в глубине единиц трансляции, но также и экспортировать из DLL.
Суть явного инстанцирования шаблонов можно объяснить на интуитивном уровне. Вот эти строки в твоем примере, это аналог явного инстанцирования:
DECLARE_CLASS1(int)
DECLARE_CLASS1(float)