C ++ - 与已经模板化的类的继承?

时间:2012-01-21 05:11:03

标签: c++ templates inheritance linked-list subclassing

所以我对Java / C#有点宠坏了,并且很明显(显然)忘记了如何用C ++编程。

我创建了一个模板化的双向链表(“Dlist”)。它在头文件(上帝,头文件怪异)中布局,并在CPP中实现。

所以,如果我记得我所知道的那个小C ++,CPP中的fn看起来像这样:

//ctor
template <typename T>
Dlist<T>::Dlist()
{
    first = NULL;
    last = NULL;
    return;
}//end fn

我想为这个Dlist创建一对子类。在一个名为“stack.cpp”的新CPP中,我有:

#include "dlist.h"

template <typename T>
class Stack : public Dlist<T>
{
  public:
     //template <typename T>
     void add(T *o) //these are virtual fns in dlist
     {
        //will call push
     }

    //template <typename T>
    T * remove() //these are virtual fns in dlist
    {
        //will call pop
    }

    //template <typename T>
    Stack()
    {
        //i have NO idea what to put in here
    }

};//end class

但是当我有了这条线

 Stack <double> stack;

在我的int main()中,Visual Studio FLIPS OUT。

  

错误C2062:输入'double'意外

     

错误C2065:'堆栈':未声明的标识符

那么:我如何正确创建和调用模板化类的子类?

允许使用cstdlib作为我的东西。你的作业!

1 个答案:

答案 0 :(得分:1)

实际上你不需要删除功能上的模板。尝试删除它。此外,在使用模板化类时,您最有可能直接在头中实现大多数函数,因此编译器将根据您传递的类型知道如何生成方法。

以下是代码:

DLIST:

template<typename T>
class Dlist
{
private:
    T* first;
    T* last;

public:
    Dlist()
    {
        this->first = NULL;
        this->last = NULL;
    }

    T* remove() 
    { 
        return NULL; 
    }

    void add(T* obj) 
    {
        // add algorithm
    }
};

堆栈:

template<typename T>
class Stack : protected Dlist<T>
{
public:
    Stack()
        : Dlist<T>() // if you need to call constructor code from the base
    {
    }

    void push(T* obj)
    {
        this->add(obj);
    }

    T* pop()
    {
        return this->remove();
    }
};

声明:

Stack<double> stack;

请注意:

class Stack : protected Dlist<T>

它受保护,因为如果你想要一个堆栈,并将Dlist继承为public,你仍然会有一个带有Stack函数的Dlist。