初学模板,写了个简单的程序,有问题
template <class T>
Node* CLinkStack<T>::Top(void)
这个地方不能通过,应该怎么写呢?
---------------------------------------------
template <class T>
class CLinkStack
{
private:
typedef struct tagNode
{
T data;
struct tagNode* next;
}Node;
public:
CLinkStack(void);
~CLinkStack(void);
public:
bool IsEmpty(void);
void Push(Node* p);
Node* Pop(void);
void Pop2(void);
Node* Top(void);
private:
Node** top;
};
template <class T>
CLinkStack<T>::CLinkStack(void)
{
top = (Node**)malloc(sizeof(Node*));
*top = NULL;
}
template <class T>
CLinkStack<T>::~CLinkStack(void)
{
Node* p = NULL;
while(!IsEmpty())
{
p = *top;
*top = p->next;
delete p;
}
p = NULL;
delete top;
top = NULL;
}
template <class T>
bool CLinkStack<T>::IsEmpty(void)
{
assert(top);
return (*top == NULL);
}
template <class T>
void CLinkStack<T>::Push(Node* p)
{
assert(top);
p->next = *top;
*top = p;
}
template <class T>
Node* CLinkStack<T>::Pop(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
top = &p->next;
}
return p;
}
template <class T>
void CLinkStack<T>::Pop2(void)
{
assert(top);
Node* p = Pop();
delete p;
p = NULL;
}
template <class T>
Node* CLinkStack<T>::Top(void)
{
assert(top);
Node* p = NULL;
if(!IsEmpty())
{
p = *top;
}
return p;
}
[解决办法]
Node是定义在CLinkStack 内部的,要加上作用域
template <class T> class CLinkStack { private: typedef struct tagNode { T data; struct tagNode* next; }Node; public: CLinkStack(void); ~CLinkStack(void); public: bool IsEmpty(void); void Push(Node* p); Node* Pop(void); void Pop2(void); Node* Top(void); private: Node** top; }; template <class T > CLinkStack <T >::CLinkStack(void) { top = (Node**)malloc(sizeof(Node*)); *top = NULL; } template <class T > CLinkStack <T >::~CLinkStack(void) { Node* p = NULL; while(!IsEmpty()) { p = *top; *top = p- >next; delete p; } p = NULL; delete top; top = NULL; } template <class T> bool CLinkStack <T>::IsEmpty(void) { assert(top); return (*top == NULL); } template <class T> void CLinkStack <T>::Push(Node* p) { assert(top); p->next = *top; *top = p; } template<class T> CLinkStack<T>::Node* CLinkStack <T>::Pop(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; top = &p->next; } return p; } template <class T> void CLinkStack <T>::Pop2(void) { assert(top); Node* p = Pop(); delete p; p = NULL; } template <class T> CLinkStack<T>::Node* CLinkStack <T>::Top(void) { assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; } return p; }
[解决办法]
#include<stdio.h>#include<stdlib.h>#include<assert.h>template <class T >class CLinkStack{private: struct Node { T data; Node* next; };public: CLinkStack(void); ~CLinkStack(void); public: bool IsEmpty(void); void Push(Node* p); Node* Pop(void); void Pop2(void); Node* Top(void);private: Node** top;};template <class T >CLinkStack <T >::CLinkStack(void){ top = (Node**)malloc(sizeof(Node*)); *top = NULL;}template <class T >CLinkStack <T >::~CLinkStack(void){ Node* p = NULL; while( !IsEmpty() ) { p = *top; *top = p->next; delete p; } p = NULL; delete top; top = NULL;}template <class T >bool CLinkStack <T >::IsEmpty(void){ assert(top); return (*top == NULL);}template <class T >void CLinkStack <T >::Push(Node* p){ assert(top); p->next = *top; *top = p;}template <class T >typename CLinkStack<T>::Node* CLinkStack<T>::Pop(void){ assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; top = &p->next; } return p;}template <class T >void CLinkStack<T>::Pop2(void){ assert(top); Node* p = Pop(); delete p; p = NULL;}template <class T >typename CLinkStack<T>::Node* CLinkStack<T>::Top(void){ assert(top); Node* p = NULL; if(!IsEmpty()) { p = *top; } return p;} int main(){ CLinkStack<int> x;}