| Microsoft DirectX 8.1 (C++) | 
A template has the following syntax definition.
template              : TOKEN_TEMPLATE name TOKEN_OBRACE
                            class_id
                            template_parts
                            TOKEN_CBRACE
template_parts        : template_members_part TOKEN_OBRACKET
                        template_option_info
                        TOKEN_CBRACKET
                      | template_members_list
template_members_part : /* Empty */
                      | template_members_list
template_option_info  : ellipsis
                      | template_option_list
                       
template_members_list :    template_members
                      | template_members_list template_members
template_members      : primitive
                      | array
                      | template_reference
primitive             : primitive_type optional_name TOKEN_SEMICOLON
array                 : TOKEN_ARRAY array_data_type name dimension_list
                        TOKEN_SEMICOLON
template_reference    : name optional_name YT_SEMICOLON
primitive_type        : TOKEN_WORD
                      | TOKEN_DWORD
                      | TOKEN_FLOAT
                      | TOKEN_DOUBLE
                      | TOKEN_CHAR
                      | TOKEN_UCHAR
                      | TOKEN_SWORD
                      | TOKEN_SDWORD
                      | TOKEN_LPSTR
                      | TOKEN_UNICODE
                      | TOKEN_CSTRING
array_data_type       : primitive_type
                      | name
dimension_list        : dimension
                      | dimension_list dimension
dimension             : TOKEN_OBRACKET dimension_size TOKEN_CBRACKET
dimension_size        : TOKEN_INTEGER
                      | name
template_option_list  : template_option_part
                      | template_option_list template_option_part
template_option_part  : name optional_class_id
name                  : TOKEN_NAME
optional_name         : /* Empty */
                      | name
class_id              : TOKEN_GUID
optional_class_id     : /* Empty */
                      | class_id
ellipsis              : TOKEN_DOT TOKEN_DOT TOKEN_DOT