Используйте макрос. Я всегда так делаю, потому что это просто и легко поддерживать.
Возьми эту ситуацию:
template <typename A, size_t B, int C, pointer_to_some_func D> class tTemplate
{
struct myStruct
{
int i, j;
};
void function1 (tTemplate <A, B, C, D> :: myStruct S);
void function2 ();
};
template <typename A, size_t B, int C, pointer_to_some_func D> void tTemplate <A, B, C, D> :: function1 (tTemplate <A, B, C, D> :: myStruct S)
{
}
и т.д ...
Представьте себе, если бы мне пришлось изменить аргумент или добавить еще один ...
Теперь с этим:
#define dTemplate tTemplate <A, B, C, D>
#define sTemplate template <typename A, size_t B, int C, pointer_to_some_func D>
sTemplate void dTemplate :: function1 (dTemplate::myStruct S)
{
}
Легче поддерживать, использовать другие классы \ шаблоны и т. Д. Изменение одного аргумента шаблона = изменение макроса, которое применяется везде. И это также приятнее для глаз.
Кроме того, я нахожу это хорошим в шаблонах, тем более что typedefs не разрешены.
И что самое лучшее в макросах, даже если IF typedefs были стандартом: вам не нужны предварительные объявления для них ... никогда! (да, макросы - это зло, но в подобных ситуациях они более чем полезны)
Что касается вашего примера:
#define dC1 C1 <T> // no ";" !!!
template <typename T> class C1
{
T t;
};
template <typename T> class C2
{
dC1 c1;
};