初学模板,写了个简单的程序,有有关问题

初学模板,写了个简单的程序,有问题
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 内部的,要加上作用域

C/C++ code


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

------解决方案--------------------
C/C++ code


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