2012-03-11 154 views
5

即使我使用-std=c++11標誌進行編譯,我的gcc版本應該支持Unrestricted union(> 4.6),但GCC對此代碼抱怨。具有構造函數的類的匿名聯合/結構

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

請注意,float4有一個非默認的構造函數,它需要0個參數。

​​

任何想法,我可以做什麼?錯誤是:

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

從你的'float4'類中移除構造函數。 – 2012-03-11 12:06:13

+1

@KerrekSB:恩,不,我不能:) – qdii 2012-03-11 12:14:40

+5

C++沒有匿名結構......它是你的編譯器的擴展 – 2012-03-11 12:25:03

回答

0

這裏的問題不在於你的float4類有一個構造,使之成爲非POD POD的老C++ 03定義下的事實。相反,問題在於你們的工會和你們工會的結構是匿名的。如果你簡單地命名它們,它將起作用:

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

「它會工作」。期望的目標是什麼?你創建了一個空的聯盟。我懷疑這是不是所期望的。 – 2012-03-11 12:31:08

+1

感謝您的解決方案,但我想保留我的匿名結構:此聯合嵌套在類中,如果我更改名稱,我將不得不重新命名每個呼叫。此代碼在MSVC10上正常工作,我希望我可以調整gcc以正確處理它。 – qdii 2012-03-11 12:59:54

+1

@qdii,問題是匿名結構不是有效的C++,所以如果你試圖用它們編寫跨平臺的代碼,你會一直遇到像這樣的編譯器問題。它會更好地避免完全使用匿名結構。 – 2012-03-11 13:19:27