Да, нет никакого способа обойти этот синтаксис (кроме как с помощью генерирующих токены уничтожающих зло злых #define
макросов).
Лично я либо вставляю их в объявление / определение шаблона класса, либо для лучшей самодокументирования помещаю определения в некоторый файл "inl", например, так:
foo.h
#ifndef FOO_H
#define FOO_H
namespace bar {
template <typename T>
class Foo {
public:
Foo () ;
virtual ~Foo();
};
}
#include "foo.inl.h"
#endif // FOO_H
foo.inl.h
#ifndef FOO_INL_H
#define FOO_INL_H
namespace bar {
template <typename T>
inline Foo<T>::Foo () {
}
template <typename T>
inline Foo<T>::~Foo () {
}
}
#endif // FOO_INL_H
Обратите внимание, что я явно объявляю их inline
тогда. Это улучшает согласованность стиля, и если вам случится специализировать шаблон, вы должны сделать это в любом случае:
template <>
inline Foo<int>::Foo() {
}
Без inline
вы испытываете ту же боль, что и при забывании его в обычных функциях, определенных в заголовочных файлах (читай: множественные ошибки определения).