在c ++中继承模板类的构造函数

时间:2013-11-19 02:54:24

标签: c++ templates inheritance

在c ++ 11中,可以继承构造函数。我有以下代码(复制示例),无法编译:

template<class T> class A
{
    ...
}

template<class T> class B : public A<T>
{
    public:       
        B(int a, int b = 0);
}
template<class T> B::B(int a, int b /* =0 */)
{
    ...
}

class C : public B<int>
{
    public: 
    using B::B;
}

以下代码不会运行C没有构造函数的错误,即来自B的错误不会被继承:

C obj(5);
//or
C obj(5, 3);

3 个答案:

答案 0 :(得分:4)

Visual Studio 2013 支持继承构造函数。有关详细信息,请参阅Support For C++11 Features。这是相关部分:

  

C ++ 11核心语言功能

     
      
  • 继承构造函数   
        
    • Visual Studio 2010:否
    •   
    • Visual Studio 2012:否
    •   
    • Visual Studio 2013:否
    •   
  •   

<强>更新

看起来对继承构造函数的支持是added in the November 2013 CTP(帽子提示:@yngum)

答案 1 :(得分:2)

原始代码的问题是B::B是私有的,因此请public

template<class T>
class B : public A<T>
{
public:   // THIS
    B(int a, int b = 0);
}

Live example.

答案 2 :(得分:0)

您不能继承构造函数,但可以在派生类的初始化列表中显式调用它。

class C: public B<int>
{
    C(int a, int b=0) : B(a, b)
    {
    }
};