繁体   English   中英

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

[英]Inheriting constructors of template class in c++

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

这继承(或更好地“转发”)零/一/二参数ctors。
当然,您必须对 3、4、5、.. arguments 重复此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM