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