Vấn đề của bạn không phải là cấu trúc không được đặt tên, đó là cấu trúc được khai báo cục bộ. Sử dụng kiểu cục bộ làm đối số mẫu không được phép trong C++ 03. Nó sẽ được trong C + + 0x mặc dù, vì vậy bạn có thể thử nâng cấp trình biên dịch của bạn.
EDIT: Trên thực tế, vấn đề của bạn là bên trong danh sách đối số mẫu không phải là nơi hợp pháp để đặt định nghĩa lớp, có hoặc không có tên, theo tiêu chuẩn C++.
litb chỉ ra rằng mặc dù nó phù hợp với ngữ pháp C++ 0x, việc xác định một loại ở đây bị cấm bởi [dcl.type]
:
Một loại-Speci fi er-seq thì không de fi ne một lớp hoặc liệt kê trừ khi nó xuất hiện trong loại-id của một khai báo bí danh (7.1.3) mà không phải là khai báo của một khai báo mẫu.
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 }
Trong một thời gian tôi đã có một câu hỏi về typedef tên, nhưng litb xóa mà lên. Họ được phép như các đối số mẫu qua:
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
Nguồn
2011-01-01 03:35:56
Trong C++ 0x, một đối tượng của một kiểu chưa đặt tên có thể được suy luận như một đối số mẫu, nhưng tôi không nghĩ một loại chưa đặt tên có thể được chỉ định rõ ràng trong danh sách đối số mẫu. –
Prasoon, bạn có thể giới thiệu cho tôi phần đúng của tiêu chuẩn không? Trường hợp thử nghiệm của tôi với một cấu trúc chưa đặt tên (được truyền cho typedef, nhưng tất cả chúng ta đều biết rằng một tên typedef không phải là một tên struct) biên dịch tốt. –
@Ben: '14.3.1/2' –