2010-10-05 25 views
7

Tôi có một cái gì đó lớp như thế:Constructor cho một không-tên struct

template <class T> 
class bag 
{ 
public: 

private: 
typedef struct{void* prev; struct{T item; unsigned int count;} body; void* next;}* node; 
typedef struct{ 
    node operator->() { return current; } 
    operator(){;} // <- i can not do that, right? 

private: 
    node current; 
} iterator; 
//... 
}; 

Vì vậy, làm thế nào để viết một constructor cho túi :: iterator?

+0

Cấu trúc "không có tên" được gọi là ẩn danh. –

+0

@Peter G .: không ẩn danh, đây là "lớp chưa đặt tên được xác định trong khai báo typedef" '7.1.3/5' – Cubbi

+0

Cảm ơn Cubbi, tôi đã sửa. –

Trả lời

6

Làm cho một số tên đẹp cho nó :-)

typedef struct NoName1 {void* prev; NoName1(){}; struct NoName2{T item; unsigned int count; NoName2() {}} body; void* next;}* node; 

EDIT: LOL xin lỗi, đã viết nó cho một sai lầm, nhưng nguyên tắc là như nhau :-)

5

Không có cách nào để viết một constructor cho bag::iterator vì iterator là một tên typedef, đó đều bị cấm được sử dụng như tên constructor:

14882:2003 12.1/3

a typedef-name đặt tên cho một lớp sẽ không được sử dụng làm mã định danh trong trình khai báo cho khai báo hàm tạo.

Thậm chí còn có một ví dụ trong tiêu chuẩn, mặc dù trong một đoạn văn khác nhau, 7.1.3/5:

typedef struct { 
    S();   //error: requires a return type because S is 
       // an ordinary member function, not a constructor 
} S; 

Bạn sẽ phải cung cấp cho rằng tái cấu trúc một cái tên, nếu bạn muốn có một nhà xây dựng người dùng định nghĩa. Phong cách lập trình typedef struct { } name; thường không được khuyến khích bởi hướng dẫn kiểu C++, với lợi ích là struct name { };.

Các vấn đề liên quan