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

Inheriting constructors of template class in c++

本文关键字:构造函数 c++ 继承      更新时间:2023-10-16

在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);

Visual Studio 2013不支持继承构造函数。有关更多信息,请参阅支持C++11功能。以下是相关部分:

C++11核心语言特点

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

更新

似乎在2013年11月的CTP(帽子提示:@yngum)中添加了对继承构造函数的支持

原始代码的问题是B::B是私有的,所以将其设为public

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

活生生的例子。

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

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

尽管@godel9的答案仍然正确(在2022年),
您可以使用以下技巧(在VS2013/vc120中):

using std::forward;
class Aaa : public Bbb {
public:
  Aaa() : Bbb() {}
  template<class A>  explicit Aaa(A a):Bbb(forward<A>(a)) {}
  template<class A,class B>  Aaa(A a,Bbb b):Bbb(forward<A>(a),forward<B>(b)) {}
};

这继承了(或者更好的是"向前")零/一/二参数因子
当然,你必须在3、4、5、。。论点。