[英]C++ template class having constructor with template
所以,我有一些基本的A级是这样的:
template<class T1>
class A {
public:
X* x;
template <class T2>
A(const A<T2> &a) {
x = new X(a->x);
}
};
T1和T2都是从X继承的类型。但是,此代码不起作用,我真的不明白如何编写它,以便构造函数能够使用可能带有不同模板参数的另一个A。
为了明确起见,我想编写一个take的构造函数,它可以采用带有不同模板参数的A。 (代码按原样进行编译,模板部分似乎并未按我希望的方式工作)。
我想要做的是:(其中Y和Z都从X继承)
A<Z> a1;
A<Y> a2(a1);
任何帮助都非常感谢!
抱歉,我认为我可以创建一个很好的示例 ,而不必使用我的实际代码,但是似乎我在语法上有点失败,所以这是我的真实类的缩写:
template <class T>
class Calendar {
private:
Date *d;
public:
template <class T2>
Calendar(const Calendar<T2> &c) {
d = new T(c.view_date_component());
}
Calendar();
~Calendar();
const Date& view_date_component() const;
};
template <class T>
Calendar<T>::Calendar() {
d = new T();
}
template <class T>
Calendar<T>::~Calendar() {
delete d;
}
template <class T>
const Date& Calendar<T>::view_date_component() const {
return *d;
}
首先,您还需要定义一个默认构造函数。 其次,您必须使模板类成为其自身的朋友才能访问私有成员变量x。 第三,在模板构造函数中,您要传递a
as const
引用。 因此,您不能使用->
(即,箭头运算符)访问它的成员,而是使用.
(即点运算符)。
template<class T1>
class A {
X* x;
public:
A() = default;
^^^^^^^^^^^^^^
template <class T2>
A(const A<T2> &a) {
x = new X(*(a.x));
^^^^^^
}
template<class T2> friend class A;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};
如果仅在T1
和T2
从X
继承时才希望唤起模板构造函数:
template <typename T2,
typename = typename std::enable_if<std::is_base_of<X, T1>::value &&
std::is_base_of<X, T2>::value>::type>
A(const A<T2> &a) {
x = new X(*(a.x));
}
如果要检查T2扩展X还是扩展T1,可以将SFINAE与std :: is_base_of一起使用 :
template <class T2, typename = std::enable_if_t<std::is_base_of<X, T2>>>
A(const A<T2> &a) {
x = new X(a->x);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.