2012-03-11 27 views
5

GCC phàn nàn về mã này mặc dù tôi biên dịch với cờ -std=c++11 và phiên bản gcc của tôi được cho là hỗ trợ các công đoàn không bị hạn chế (> 4.6).Công đoàn/cấu trúc ẩn danh của lớp với hàm tạo

union 
{ 
    struct 
    { 
     float4 I,J,K,T; 
    }; 
    struct 
    { 
     float4 m_lines[4]; 
    }; 
    struct 
    { 
     float m16f[16]; 
    }; 
    struct 
    { 
     float m44f[4][4]; 
    }; 
}; 

Lưu ý rằng float4 có hàm tạo mặc định không nhận 0 thông số.

class float4 
{ 
    public: 
     float4(); 
.... 
}; 

Bất kỳ ý tưởng nào về những gì tôi có thể làm? Lỗi này là:

<anonymous union>::<anonymous struct>::I’ with constructor not allowed in anonymous aggregate 
+0

Xóa hàm khởi tạo khỏi lớp 'float4' của bạn. –

+1

@KerrekSB: Vâng, không, tôi không thể :) – qdii

+5

C++ không có cấu trúc ẩn danh ... đó là phần mở rộng của trình biên dịch –

Trả lời

0

Vấn đề ở đây không phải là một thực tế rằng lớp học của bạn float4 có một constructor, làm cho nó một tổ chức phi POD dưới cũ C++ 03 định nghĩa về POD. Thay vào đó, vấn đề là công đoàn của bạn và các cấu trúc trong công đoàn của bạn là vô danh. Nếu bạn chỉ cần đặt tên cho chúng, nó sẽ hoạt động:

union u 
{ 
    struct s1 
    { 
     float4 I,J,K,T; 
    }; 
    struct s2 
    { 
     float4 m_lines[4]; 
    }; 
    struct s3 
    { 
     float m16f[16]; 
    }; 
    struct s4 
    { 
     float m44f[4][4]; 
    }; 
}; 
+4

"nó sẽ hoạt động". mục tiêu mong muốn là gì? bạn đã tạo ra một liên minh trống. tôi nghi ngờ rằng điều này là mong muốn mặc dù. –

+1

Cảm ơn giải pháp, nhưng tôi muốn giữ cấu trúc ẩn danh của tôi: liên minh này được lồng trong một lớp và nếu tôi thay đổi tên, tôi sẽ phải đổi tên mọi cuộc gọi. Mã này hoạt động tốt trên MSVC10, tôi ước tôi có thể tinh chỉnh gcc để xử lý nó một cách chính xác. – qdii

+1

@qdii, vấn đề là các cấu trúc ẩn danh không hợp lệ C++, vì vậy bạn sẽ gặp phải các vấn đề về trình biên dịch như thế này mọi lúc nếu bạn cố gắng viết mã đa nền tảng bằng cách sử dụng chúng. Nó sẽ phục vụ bạn tốt hơn để tránh sử dụng hoàn toàn các cấu trúc ẩn danh. –

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