2011-11-09 24 views
16

Tuyên bố một trường tĩnh của một loại chưa hoàn thành tại thời điểm định nghĩa lớp hợp pháp trong C++? Ví dụ:Trường tĩnh của loại không đầy đủ - có hợp pháp không?

foo.h:

class Foo 
{ 
public: 
    // ... 
private: 
    class Bar; 
    static Bar something; 
}; 

Foo.cpp:

class Foo::Bar 
{ 
    // ... 
}; 

Foo::Bar Foo::something; 

// some more code 

Trình biên dịch dường như chấp nhận nó, và tôi không thấy có lý do mà nó phải được bị từ chối, nhưng tiêu chuẩn nói gì về tình huống như vậy? Tôi thực sự đánh giá cao một người đưa ra một trích dẫn trực tiếp từ tiêu chuẩn, tốt nhất là từ "cũ" (một từ năm 2003).

Trả lời

13

Có, những gì bạn đang làm được cho phép cụ thể (§9.4.2/2): "Việc khai báo thành viên dữ liệu tĩnh trong định nghĩa lớp của nó không phải là định nghĩa và có thể thuộc loại không đầy đủ khác với cv- đủ điều kiện void. "

2

Tôi không thể trích dẫn từ tiêu chuẩn, nhưng tôi có thể cung cấp cho bạn lời khuyên để "nghĩ như một trình biên dịch".

Tại thời điểm bạn tuyên bố something, trình biên dịch cần biết gì về loại? Nếu nó là một thành viên bình thường, nó sẽ cần phải biết kích thước để nó có thể bao gồm nó trong định nghĩa lớp, nhưng điều đó không đúng cho các thành viên tĩnh vì lưu trữ của họ không phải là một phần của lớp. Nó không cần phải biết làm thế nào để xây dựng nó bởi vì nó sẽ không được xây dựng như là một phần của xây dựng lớp học. Có thực sự không phải là bất cứ điều gì trình biên dịch cần biết về lớp tĩnh đó tại thời điểm nó được khai báo, do đó, một tờ khai chuyển tiếp hoạt động tốt.

+1

Yup. Đó là lý do tại sao tôi nói "Tôi không thấy một lý do mà nó nên bị từ chối". Tôi biết những điều bạn đã viết, tôi không chắc liệu tiêu chuẩn không cho phép mã như thế vì một lý do nào đó (đó là C++, bạn không bao giờ có thể chắc chắn), đó là lý do tại sao tôi muốn báo giá trực tiếp. Ngoài ra, tôi phải hỏi câu hỏi đầu tiên của mình ở đây;) – Fanael

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