2016-07-05 65 views
0
struct Dingus { 
union { 
    int dingly[4 *4]; 
    vec3 dinglyDo; 
}diddly; 
inline Dingus() {} 
}; 

此代碼將產生錯誤試圖引用刪除功能的錯誤與匿名聯合

error C2280: 'Dingus::<unnamed-type-diddly>::<unnamed-type-diddly>(void)': attempting to reference a deleted function 

奇怪的是,當我刪除了「diddly」,這是給予工會的引用,沒有任何錯誤。

vec3是GLM庫中的一個結構體,我可以用其他一些類替換這個類型,我會得到相同的錯誤...但是如果我用float這樣簡單的東西替換它,我不會得到錯誤

由於刪除「diddly」刪除錯誤,這似乎是比這one

+2

什麼是'Vec3':您的代碼很容易被替代? – LogicStuff

+0

@LogicStuff這是一個結構從GLM庫,我可以用一些其他的東西代替的類型,我會得到同樣的錯誤......但如果我有一些簡單的像浮更換它,我沒有得到錯誤 – Thomas

+0

可能複製[非平凡的成員C++ 11匿名聯合(http://stackoverflow.com/questions/10693913/c11-anonymous-union-with-non-trivial-members)的 – PcAF

回答

3

你已經宣佈匿名聯合類型的成員一個不同的問題,因此成員需要進行初始化構造函數Dingus。因爲工會有不平凡的類型的成員有沒有默認構造函數,所以它不能在Dingus構造函數初始化。

您可以定義一個構造工會類型的表示時,它的默認構造例如應該發生什麼

struct Dingus { 
    union U { 
    int dingly[4 *4]; 
    vec3 dinglyDo; 
    U() : dingly() { } 
    } diddly; 
    inline Dingus() {} 
}; 
+2

如果'variant'變成標準,所有這些工會都不需要... –

+0

@KerrekSB也許這個評論是推動他們的邊緣。 [variant](http://en.cppreference.com/w/cpp/utility/variant) –

+2

@FantasticMrFox:是的。對於是否花時間研究當時正在浮動的新方向,例如「結節」,「感知」和「麒麟呼叫語法」,委員會無疑困惑不已,但是當這個評論進入時,一切都被放棄了,國家與主要召集人背後對齊的身體,並開始發送紙張支持變體後的紙張。有些人警告說,我們會在接下來的二十年中研究變體。有笑聲。 –

0

由於c++17可以使用std::variant,而不是一個工會來解決這個問題。

struct Dingus { 
    std::variant<std::array<int, 4*4>, vec3> diddly; 
    inline Dingus() {} 
}; 
+0

你不能在'std :: variant'中存儲數組,使用'std :: array'。 –

+0

@JonathanWakely雖然我改變了它,並且我不知道如何使用數組,但它確實會編譯... http://coliru.stacked-crooked.com/a/5c4c50ffbc38722b –