テンプレートスタックの実装および呼び出しに失敗しました


シーンの説明:テンプレートスタックは実装されていますが、呼び出し中に基本的な機能は実装されません.
次のように宣言します.
template<class T>struct SNode
{
    T t;
    SNode<T>* pNextNode;
};

template<class T>
class CStack
{

private:
    SNode<T>* m_pCStackTop;
    int  m_nNodeCount;

public:
    CStack();

    ~CStack();

    // 
    int PushStack(T t);

    // 
    int GetTop(T& t);

    // 
    int PopStack(T& t);

    int DisplayStack();

    bool IsStackNotEmpty();


}; 
 :
#include <stdio.h>#include <stdlib.h>
#include <iostream>
using namespace std;
#include "stack.h"

template<class T>
CStack<T>::CStack()
{
   // 
   m_pCStackTop=new SNode<T>;
   if(NULL==m_pCStackTop)
   {
       exit(-1);
   }
   m_pCStackTop->pNextNode=NULL;

}
template<class T>
CStack<T>::~CStack()
{
    SNode<T>* pTmpNode=m_pCStackTop;
    while(NULL!=pTmpNode)
    {
        m_pCStackTop=pTmpNode->pNextNode;
        delete pTmpNode;
        pTmpNode=m_pCStackTop;
    }
}
template<class T>
int CStack<T>::PushStack(T t)
{
    SNode<T>* pNewNode=new SNode<T>;
    pNewNode->t=t;

    if(NULL==pNewNode)
    {
        exit(-1);

    }

    pNewNode->pNextNode=m_pCStackTop->pNextNode;
    m_pCStackTop->pNextNode=pNewNode;
    return 0;
}
template<class T>
int CStack<T>::GetTop(T &t)
{
    if(NULL==m_pCStackTop->pNextNode)
    {
        return -1;
    }

    t=m_pCStackTop->pNextNode->t;
    return 0;
}
template<class T>
int CStack<T>::PopStack(T &t)
{
    if(NULL==m_pCStackTop->pNextNode)
    {
        return -1;
    }

    t=m_pCStackTop->pNextNode->t;

    SNode<T>* pTmpNode=m_pCStackTop->pNextNode;
    m_pCStackTop->pNextNode=pTmpNode->pNextNode;
    delete pTmpNode;
    return 0;
}
template<class T>
int CStack<T>::DisplayStack()
{
    SNode<T>* pTmpNode=m_pCStackTop->pNextNode;
    while((NULL!=pTmpNode))
    {
        pTmpNode=pTmpNode->pNextNode;
    }
}

template<class T>
bool CStack<T>::IsStackNotEmpty()
{
    if(NULL!=m_pCStackTop->pNextNode)
    {
        return true;
    }

    return false;
}