如何使用 2 个类的模板模板,其中一个是另一个类的遗传

How to use a template of a template of 2 classes which one is hereditary of the other class

本文关键字:一个 另一个 何使用      更新时间:2023-10-16

如何使用模板的模板?给出了以下问题:

您有两个类(只是一个简单的概述来显示我的观点):

class one
{
private:
   int data;
public:
   one();
   int getData();
   void setData(int s);
}
class two: public one
{
private:
   one * current;
public:
   two();
   one * function1();
   one * function2(one * s);
   void add(int d);
   void add(int d, one * s);
}

现在我会这样做模板 1(第一类):

template <class T>
class one
{
private:
   T data;
public:
   one();
   T getData();
   void setData(T s);
}

在第二个类的一个函数中,我必须创建一个类一的对象。现在我不确定如何创建第二类的模板。我的想法是:

template <class T1, class T2>
class two: public one
{
private:
   T2 current;
public:
   two();
   T2 function1();
   T2 function2(T2);
   void add(T1 d);
   void add(T1 d, T2 s);
}

但是,如果我必须在 function1() 中创建例如类 1 的对象,我必须像这样创建它:

one<int> s = new one; 

我的问题是我不将使用静态类型,所以我会尝试这个:

one<T1> s = new one;

希望你能给我一个在我的课堂上使用模板的正确形式!

two只需要一个模板参数:

template <class T>
class two: public one<T>
{
private:
   one<T>* current;
public:
   two();
   one<T>* function1();
   one<T>* function2(one<T>*);
   void add(T d);
   void add(T d, one<T>* s);
};

现场示例:https://ideone.com/nrTK6C

正确的语法只涉及使用 one<T>

template <class T>
class two: public one<T>
{
private:
   one<T>* current;
public:
   two();
   one<T>* function1();
   one<T>* function2(one<T>*);
   void add(T d);
   void add(T d, one<T>* s);
}

从类派生并持有指向同一类对象的指针似乎有点奇怪,但我假设你有一个合理的用例。

该操作是不可能的。

首先,您的类two在从它派生时必须指定 one 的模板参数。

其次,不能使用继承来回避C++是静态类型语言的事实。您必须知道正在使用的类型的所有类型。如果one是模板,则必须指定模板参数,使其成为实际可以使用的完整类型。您不能简单地希望参数消失。

你只有两个选择。指定 one 接口的子集,该子集不依赖于该参数,one从该参数继承,然后使用该参数。或者,您可以简单地将适当的参数传递给 one 的用户。

相关文章: