Как вы хотите, стандарт, вот он:
C ++ 03, 14.1, Параметры шаблона:
A template defines a family of classes or functions.
template-declaration:
exportopt template < template-parameter-list > declaration
template-parameter-list:
template-parameter
template-parameter-list , template-parameter
template-parameter:
type-parameter
parameter-declaration
type-parameter:
class identifieropt
class identifieropt = type-id
typename identifieropt
typename identifieropt = type-id
template < template-parameter-list > class identifieropt
template < template-parameter-list > class identifieropt = id-expression
..
Параметр типа определяет свой идентификатор как имя типа (если оно объявлено с помощью class или typename) или имя шаблона (если оно объявлено с шаблоном) в области действия объявления шаблона.
..
Если использование шаблона-аргумента приводит к неправильной конструкции при создании шаблона специализации, программа является плохо сформированной.
Другое относится к параметрам по умолчанию, нетиповым шаблонам и т. Д. Другими словами, стандарт не говорит что-либо о T
.