Twój problem nie polega na tym, że nazwa struktury jest bez nazwy, ponieważ struktura jest zadeklarowana lokalnie. Używanie lokalnych typów jako argumentów w szablonach jest niedozwolone w C++ 03. Będzie jednak w C++ 0x, więc możesz spróbować uaktualnić swój kompilator.
EDYCJA: W rzeczywistości twój problem polega na tym, że wewnątrz listy szablonów nie jest legalne miejsce do umieszczenia definicji klasy, z lub bez nazwy, zgodnie ze standardem C++.
litb zwraca uwagę, że chociaż pasuje do gramatyki C++ 0x, określające typ tutaj jest zabronione przez [dcl.type]
: Typ-specy fi er-nast powinien chyba że pojawi się klasa lub wyliczenie
nie de fi ne w identyfikatorze typu deklaracji (7.1.3), która nie jest deklaracją szablonu.
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 }
Przez chwilę miałem pytanie o typedef nazwisk, ale litb wyczyszczone, że aż. Są one dopuszczone jako argumenty szablonu poprzez:
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
W C++ 0x, obiekt typu nienazwanego można wyprowadzić jako argument szablonu, ale nie sądzę Typ bez nazwy może być określony jawnie na liście argumentów szablonu. –
Prasoon, czy możesz skierować mnie do właściwej części normy? Mój przypadek testowy z nienazwaną strukturą (przekazywany do typedef, ale wszyscy wiemy, że nazwa typedef nie jest nazwą struktury) kompiluje się dobrze. –
@Ben: '14.3.1/2' –