2014-08-29 73 views
15

我在我的項目遇到以下錯誤:繼承,構造函數+一流初始化非默認constructabe型失敗

 
error: use of deleted function ‘C::C(int)’ note: ‘C::C(int)’ is 
implicitly deleted because the default definition would be ill-formed: 
error: use of deleted function ‘M::M()’ 

這是我使用的代碼:

struct M { 
    M(int){} 
    M() = delete; // Allowing this would work. 
}; 

struct B { 
    B(int) {} 
    B() = delete; 
}; 

struct C : public B { 
    using B::B; 
    M n = {5}; 

    // C(int i) : B(i) {} // Adding this would work 
}; 

C c{1}; 

有誰知道爲什麼會發生這種情況?


顯然,語言願意附加在繼承的構造結束多個初始化(因爲它是願意叫一個默認的構造函數)。顯然,它願意隱式地將一個調用添加到非默認構造函數(在類初始化中)到明確定義的構造函數的末尾。但由於某種原因,我不明白,它不願意同時做兩個。

根據this question,完美的轉發並不是非常完美,不應該在這裏使用。

注意:在實際情況下,B的構造函數更爲複雜且易於更改,因此手動轉發內容並不是真正的可行選項。

+0

問題在刪除'B()'?編譯器不能編寫默認的'C()',因爲它需要默認的'B()'存在... – Arkadiy 2014-08-29 19:00:39

+0

程序編譯時使用鏗鏘語言++ 3.5 – dyp 2014-08-29 19:03:43

+2

據我瞭解標準,這個程序實際上很好-formed。隱式定義的'C(int)'ctor應該被定義爲'C(int p):B(static_cast (p)){}' – dyp 2014-08-29 19:04:48

回答