所以我对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作为我的东西。你的作业!
答案 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。