2015-12-17 225 views
1

我正在閱讀有關Inheriting constructors here的文檔。這裏有一個例子:繼承構造函數和默認構造函數

struct B1 { 
    B1(int); 
}; 
struct D1 : B1 { 
    using B1::B1; 
// The set of inherited constructors is 
// 1. B1(const B1&) 
// 2. B1(B1&&) 
// 3. B1(int) 

// D1 has the following constructors: 
// 1. D1() 
// 2. D1(const D1&) 
// 3. D1(D1&&) 
// 4. D1(int) <- inherited 
}; 

因此它寫清楚D1 has the following constructors: D1(),即默認構造函數。但是,當我試圖創建一個對象:

D1 d;

而且我有一個錯誤use of deleted function 'D1::D1()'。這是文檔中的錯誤還是我誤解了某些內容?

我用C++ 14試過gcc。

+0

@POTEMKINDX您忘記在'main()'中添加'D1 d;'。如果你確實看到它不起作用:http://coliru.stacked-crooked.com/a/220ea673061325fd – NathanOliver

+0

@POTEMKINDX你沒有調用導致[error]的構造函數(http://ideone.com/dRGxbH ) – user463035818

+0

@POTEMKINDX已更新。順便說一句,你沒有創建一個實例。 – nikitablack

回答

-2

稍微向下一點,它說它沒有默認的構造函數

D1 e; //錯誤:D1無默認構造函數

+1

所以在頁面上有矛盾的信息,但是這並不能解釋爲什麼'D1'在這種情況下沒有默認的構造函數。 – user463035818

+0

是的,我認爲它可能是誤導性的,如果你看到這個arcticle http://en.cppreference.com/w/cpp/language/default_constructor的例子,因爲有另一個構造則d()未聲明。 –

1

考慮下面的代碼:

struct B1                                                 
{ 
    B1(int){} 
}; 

struct D1 : B1 { 
    using B1::B1; 
}; 


struct E 
{ 
    E(){} 
}; 


struct F 
{ 
    F(int){} 
}; 

如果您嘗試寫

E e; 

,將建造好的,但

F f; 

將會失敗。通過聲明一個需要int的ctor,你已經有效地刪除了默認ctor。

你的問題的代碼遵循相同的原則。一旦你將B1的ctor拖入D1 - 你已經有效地刪除了它的默認ctor。