2013-08-06 46 views
1

考虑下面的代码的集合的类:一类的聚合初始化该私人继承在C++ 11

struct base 
{ 
    int x, y, z; 
}; 

struct derived : private base 
{ 
    using base::base; 
}; 

int main(int argc, const char *argv[]) 
{ 
    base b{1, 2, 3}; // Allowed 
    derived d{1, 2, 3}; // Not allowed 
} 

线derived d{1, 2, 3};使我的编译器(锵3.3)失败,错误“不匹配的构造进行初始化'派生'“。为什么是这样?有什么办法通过聚合初始化来初始化derived

回答

9

derived有一个基类,所以它不是一个聚合(§8.5.1/ 1:“一个聚合是一个数组或类(第9条),没有基类[...] “)。

由于它不是聚合,所以不能使用聚合初始化进行初始化。

最明显的解决办法可能会是一个ctor添加到基地,并通过对basederived传递参数构造函数的:

struct base 
{ 
    int x, y, z; 

    base(int x, int y, int z) : x(x), y(y), z(z) {} 
}; 

struct derived : private base 
{ 
    derived(int a, int b, int c) : base(a, b, c) {} 
}; 

int main(int argc, const char *argv[]) 
{ 
    base b{1, 2, 3}; // Allowed 
    derived d{1, 2, 3}; // Allowed 
} 

当然,如果你设置不起作用在base剩下一个聚合。

编辑:对于编辑的问题,我看不到在这里使用std::initializer_list的方法 - std::array没有任何东西可以接受initializer_list

+0

啊,我现在觉得自己像个白痴。我猜唯一的解决方法是将一个构造函数添加到'derived',它需要一个initializer_list并用它构造'base'? – robinjam

+0

@robinjam:查看编辑答案。 –