[英]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.