2015-05-20 47 views
8

Khi viết câu hỏi ban đầu của tôi, nếu điều này thậm chí có thể xảy ra, tôi đã vấp về câu hỏi static constexpr member of same type as class being defined, câu trả lời rõ ràng là giải pháp của tôi không thể thực hiện được với C++ 11.Thành viên constexpr tĩnh cùng loại với lớp được xác định (chi tiết bổ sung)

Nhưng sau đó tôi đã đưa ra mã này là khá gần với các poster ban đầu và tôi muốn đạt được:

class MyEnum 
{ 
public: 
    constexpr MyEnum() : m_null(true), m_value(0) { } 
    constexpr MyEnum(const unsigned int v) : m_null(false), m_value(v) { } 

    constexpr operator unsigned int() const { return m_value; } 

    static constexpr const MyEnum one() { return MyEnum(1); } 

private: 
    bool m_null; 
    unsigned int m_value; 
}; 

Vì vậy, tôi rephrasing câu hỏi của tôi: Tại sao các giải pháp cho one biên dịch và có thể được sử dụng như bạn mong đợi nhưng các giải pháp sau đây đưa ra lỗi về việc sử dụng một lớp chưa hoàn chỉnh?

class MyEnum 
{ 
public: 
    // snip... 

    static constexpr const MyEnum two = MyEnum(2); 
    static constexpr const MyEnum three = 3; 

    // snip... 
} 
+1

Các phần tử của các hàm thành viên được biên dịch như thể chúng được đặt sau định nghĩa lớp. Nghĩa là, lớp được hoàn thành trong các cơ quan hàm thành viên. (Xem thêm [CWG 1255] (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1255)) – dyp

Trả lời

9

Khi @dyp đề cập giải pháp cho one biên dịch vì định nghĩa chức năng được biên dịch sau nội dung lớp học. Vì vậy, nó là như one đã được tuyên bố như thế này

class MyEnum 
{ 
public: 
    static constexpr const MyEnum one(); 
    //... Definition here 
}; //Class is fully defined after here 

inline static constexpr const MyEnum MyEnum::one() { return MyEnum(1); } 
         //Fine here because class is complete ^^^^ 

Mặt khác, định nghĩa trong cơ thể lớp được biên dịch khi chúng được đặt trong cơ thể lớp. Vì vậy, khi twothree đang được biên soạn, lớp học chưa được xác định đầy đủ.

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