gpt4 book ai didi

具有带模板的构造函数的 C++ 模板类

转载 作者:行者123 更新时间:2023-11-28 05:57:07 24 4
gpt4 key购买 nike

所以我有一些像这样的基础类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。 (代码按原样编译,模板部分似乎没有按照我想要的方式工作)。

我希望能够做的事情:(YZ 都继承自 X)

A<Z> a1;
A<Y> a2(a1);

非常感谢任何帮助!

抱歉,我认为我可以创建一个很好的示例,而不必使用我的实际代码,但似乎我在语法方面有点失败,所以这是我真正的类(class)剪辑向下一点:

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;
}

最佳答案

首先,您还需要定义一个默认构造函数。其次,您必须使模板类成为其自身的友元才能访问私有(private)成员变量 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;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

Live Demo

如果您希望仅当 T1T2 继承自 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));
}

Live Demo

关于具有带模板的构造函数的 C++ 模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com