(вопрос про "почему именно такая структура классов и параметров шаблонов" - не надо задавать 

 Мне так нужно.)
пусть изначально имеется такой набор классов
//тип, введённый для возможности специализации шаблона A (см далее)
struct s_VOID
{
};
//A - работает с двумя параметрами
template<class PARAM1,class PARAM2>
struct A
{
        PARAM1 m_p1;
        PARAM2 m_p2;
        //реализация A
        //...
};
//B - работает с первым параметром
template<class PARAM1,class T2>
//template<class PARAM1>
struct B
{
        PARAM1 m_p1;
        //реализация B
        //...
};
//C - работает со вторым параметром
template<class T1,class PARAM2>
//template<class PARAM2>
struct C
{
        PARAM2 m_p2;
        //реализация C
        //...
};
объявление трёх переменных с РАЗНЫМИ именами шаблонов
A<int   ,char  > a;
B<short ,s_VOID> b;
C<s_VOID,long  > c;
И ЧЕГО ХОЧЕТСЯ ДОБИТЬСЯ
//тип, введённый для возможности специализации шаблона A (см далее)
struct s_VOID
{
};
объявление трёх переменных с ОДНИМ именем шаблона - A
A<int   ,char  > a;
A<short ,s_VOID> b;
A<s_VOID,long  > c;
для этого нужно как-то так задать специализацию A.
пробую вот так, но компилятор не пропускает
template<class PARAM1,s_VOID m_p2>
struct A
{
        PARAM1 m_p1;
        //реализация B
        //...
};
template<s_VOID m_p1,class PARAM2>
struct A
{
        PARAM2 m_p2;
        //реализация C
        //...
};
что нужно подправить ? Или такая вещь невозможна ?