2012-01-13 15 views
5

Tôi đang xây dựng một lớp có một liên minh cho dữ liệu ma trận của nó, tuy nhiên, tôi chỉ có thể nhận được nó biên dịch khi tôi không có một tên cho struct \ union. Tuy nhiên, với mức cảnh báo cấp cao hơn (bốn trên studio trực quan), tôi sẽ cảnh báo rằngLàm cách nào để ngăn chặn cấu trúc không tên union?

warning C4201: nonstandard extension used : nameless struct/union 

Tôi xem xét nó và dường như tôi không thể tìm cách ngăn chặn điều này. Dù sao có thể tôi biết sẽ gây ra một lỗi trình biên dịch khác nhau liên quan đến việc khai báo của một hay khác. Làm thế nào tôi có thể ngăn chặn nhận được cảnh báo này và làm cho nó phù hợp với tiêu chuẩn, mà không cần vô hiệu hóa các cảnh báo.

union 
    { 
     struct 
     { 
      F32 _11, _12, _13, _14; 
      F32 _21, _22, _23, _24; 
      F32 _31, _32, _33, _34; 
      F32 _41, _42, _43, _44; 
     }; 
     F32 _m[16]; 
    }; 

(Vâng, tôi biết có thư viện matric sẵn. Xin đừng tắt chức năng này thành một "sử dụng xxx thư viện" thảo luận, tôi đang làm điều này để mở rộng kiến ​​thức của tôi về C++".)

+0

Vì lợi ích của người đọc trong tương lai, bạn có thể hiển thị mã có tên cấu trúc và không biên dịch không? –

Trả lời

6

Naming có vẻ như tốt nhất. đoàn Anonymous được cho phép trong C++, chỉ cần không cấu trúc.

union 
{ 
    struct foo 
    { 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    } bar; 
    F32 _m[16]; 
}; 

Bạn có thể sử dụng tài liệu tham khảo/macro cho phép truy cập mà không bar.

F32& _11 = bar._11; 
F32& _12 = bar._12; 

Về bản chất giống như cấu trúc ẩn danh. Tôi không thực sự đề nghị này mặc dù. Sử dụng bar._11 nếu có thể.


cá nhân/công cộng (sorta):

struct mat 
{ 
    struct foo 
    { 
    friend class mat; 
    private: 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    }; 
    union 
    { 
    foo bar; 
    F32 _m[16]; 
    }; 
}; 
+0

Điều đó dường như làm điều đó. Mặc dù không phải là một phần của câu hỏi ban đầu, có cách nào để làm cho thanh được bảo vệ \ riêng tư trong khi vẫn cho phép _m được công khai không? – mmurphy

+1

@mmurphy Xem cập nhật của tôi. Đó là một phần có thể. – Pubby

+0

Oh ok, thú vị. Một điều cuối cùng, tôi nhìn vào sử dụng tài liệu tham khảo (tôi muốn sử dụng _11 nếu có thể, không có tiền tố trên nó). Làm thế nào có thể tham chiếu được khai báo trong lớp học? Một cái gì đó như "F32 & _11 = bar._11;" không thể ở nơi công cộng. – mmurphy

3

Nếu tất cả các bạn muốn làm là để vô hiệu hóa các cảnh báo mà không thay đổi mã thực tế thì bạn có thể sử dụng #pragma warning chỉ thị như vậy:

#pragma warning(disable : 4201) 

Nếu bạn muốn bật lại, hãy sử dụng:

#pragma warning(default : 4201) 

Để tham khảo thêm, hãy xem MSDN documentation.

+0

Xin lỗi, tôi cần phải cụ thể hơn và nói mà không cần tắt cảnh báo – mmurphy

-1

Bạn có cảnh báo này không phải về cấu trúc bên trong mà về bản thân công đoàn. Hãy thử điều này:

union Mat // <------- 
{ 
    struct 
    { 
     F32 _11, _12, _13, _14; 
     F32 _21, _22, _23, _24; 
     F32 _31, _32, _33, _34; 
     F32 _41, _42, _43, _44; 
    }; 
    F32 _m[16]; 
}; 

Mat mat; 
mat._11 = 42; 
F32 x = mat._22; 
mat._m[ 3 ] = mat._33; 
Các vấn đề liên quan