Ваша проблема не в том, что структура безымянна, а в том, что структура объявлена локально. Использование локальных типов в качестве аргументов шаблона запрещено в C ++ 03. Хотя это будет в C ++ 0x, так что вы можете попробовать обновить ваш компилятор.
РЕДАКТИРОВАТЬ: На самом деле ваша проблема в том, что внутри списка аргументов шаблона не разрешено помещать определение класса, с именем или без, в соответствии со стандартом C ++.
litb указывает на то, что хотя он вписывается в грамматику C ++ 0x, определение типа здесь запрещено [dcl.type]
:
Спецификатор типа-seq не должен определять класс или перечисление, если он не указан в идентификаторе типа объявления псевдонима (7.1.3), которое не является объявлением объявления шаблона.
simple-template-id:
template-name < template-argument-list_opt >
template-argument-list:
template-argument ..._opt
template-argument-list , template-argument ..._opt
template-argument:
constant-expression
type-id
id-expression
type-id:
type-specifier-seq abstract-declarator_opt
type-specifier-seq:
type-specifier attribute-specifier-seq_opt
type-specifier type-specifier-seq
type-specifier:
trailing-type-specifier
class-specifier
enum-specifier
class-specifier:
class-head { member-specification_opt }
Некоторое время у меня был вопрос об именах typedef, но litb прояснил это. Они допускаются в качестве аргументов шаблона через:
trailing-type-specifier:
simple-type-specifier
elaborated-type-specifier
typename-specifier
cv-qualifier
simple-type-specifier:
:: opt nested-name-specifier_opt type-name
:: opt nested-name-specifier template simple-template-id
char
char16_t
char32_t
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
auto
decltype-specifier
type-name:
class-name
enum-name
typedef-name
simple-template-id