即使使用`using`也不会继承构造函数

时间:2014-01-30 14:36:33

标签: inheritance c++11

我想知道为什么以下代码无法编译。这只是一个展示示例,我不是在争论标准容器的继承等。

class A : public std::array<int,3>
{
public:
    using std::array<int,3>::array;

    // define other methods (no data members)
};

int main(int argc, char **argv) {        
    A a ({1,2,3});      
    return 0;
}

编译器(g ++)抱怨因为它只能找到默认的构造函数A(),尽管我认为我做了从std::array继承构造函数所需要的东西。

有人请注意解释为什么它会这样做以及如何在不重新定义和转发隐式构造函数的情况下解决该问题?

当然是代码

using A = std::array<int,3>

int main(int argc, char **argv) {        
    A a ({1,2,3});      
    return 0;
}

编译得很好,但我需要添加一些自制的操作符来满足我的目的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

std::array没有构造函数,除了自动构造函数以保持聚合,并且具有基类是对聚合初始化规则的拒绝,如下所示:http://en.cppreference.com/w/cpp/language/aggregate_initialization

答案 1 :(得分:0)

您提供给构造函数的支撑列表被视为一个参数。编译器正在寻找具有A类参数的构造函数。此参数必须能够接受3个整数的支撑列表才能使用它。由于A类没有这样的构造函数,编译器会发出错误。