C++模板类具有带模板的构造函数
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。
因此,为了明确起见,我想写一个构造函数,它将能够使用不同的模板参数来获取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
作为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);
}
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为