2015-12-17 224 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。