Ihr Problem ist nicht, dass die Struktur unbenannt ist, es ist, dass die Struktur lokal deklariert ist. Lokale Typen als Vorlagenargumente zu verwenden ist in C++ 03 nicht erlaubt. Es wird jedoch in C++ 0x sein, also könnten Sie versuchen, Ihren Compiler zu aktualisieren.
EDIT: Eigentlich Ihr Problem ist, dass die Liste in einer Template-Argumente ist kein juristischer Ort, um eine Klassendefinition zu setzen, mit oder ohne Namen, nach dem C++ Standard.
litb weist darauf hin, dass, obwohl sie paßt in die C++ 0x Grammatik, hier eine Art der Definition von [dcl.type]
verboten ist:
Eine Art spezifische er-Seq wird nicht de fi nieren eine Klasse oder Aufzählung, es sei denn es erscheint in der Typ-ID einer Alias-Deklaration (7.1.3), die nicht die Deklaration einer Template-Deklaration ist.
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 }
Eine Zeit lang hatte ich eine Frage über typedef Namen, aber litb gelöscht das wieder wett. Sie werden als Vorlage Argumente über erlaubt:
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
In C++ 0x kann ein Objekt eines unbenannten Typs als Template Argument abgeleitet werden, aber ich denke nicht Ein unbenannter Typ kann explizit in der Vorlagenargumentliste angegeben werden. –
Prasoon, können Sie mich bitte auf den richtigen Teil des Standards verweisen? Mein Testfall mit einer unbenannten Struktur (übergeben an ein typedef, aber wir alle wissen, dass ein typedef Name kein Strukturname ist) kompiliert einfach gut. –
@Ben: '14.3.1/2' –