有人能给稍微详细解释下这段代码不?!

从没正儿八经用过C++,最近看人家的一个嵌入程序代码,
看不懂啊。。。求高人废神,帮我解释下这段代码。

    template<typename T, size_t N>
    class Container
    {
    private:
        size_t m_iCnt;
        T m_Data[N];
    public:
        Container(){m_iCnt = 0;};
        ~Container(){};
        bool Push(T& In)
        {
            for(size_t i = 0; i < m_iCnt; i++)
            {
                if(In == m_Data[i])
                    return false;
            }
            if(m_iCnt < N)
            {
                m_Data[m_iCnt] = In;
                m_iCnt++;
                return true;
            }else
                return false;
        };
        bool Pop(T& Out)
        {
            if(m_iCnt > 0)
            {
                m_iCnt--;
                Out = m_Data[m_iCnt];
                return true;
            }else
                return false;
        };
        bool IsEmpty(void)
        {
            return 0==m_iCnt;
        };
        bool IsFull(void)
        {
            return N==m_iCnt;
        };
        size_t Count()
        {
            return m_iCnt;
        };
    };
 template<typename T, size_t N> //定义模版,及常说的泛型
class Container
{
private:
    size_t m_iCnt;//游标
    T m_Data[N];//长度为N 的数组
public:
    Container()
    {
        m_iCnt = 0;//构造函数
    };
    ~Container() {};//析构函数,它会在每次删除所创建的对象时执行
    bool Push(T& In)//入栈
    {
        for(size_t i = 0; i < m_iCnt; i++)//已存在则不入栈
        {
            if(In == m_Data[i])
                return false;
        }

        if(m_iCnt < N)
        {
            m_Data[m_iCnt] = In;
            m_iCnt++;
            return true;
        }
        else
            return false;
    };
    bool Pop(T& Out)//出栈
    {
        if(m_iCnt > 0)
        {
            m_iCnt--;
            Out = m_Data[m_iCnt];
            return true;
        }
        else
            return false;
    };
    bool IsEmpty(void)//判空
    {
        return 0 == m_iCnt;
    };
    bool IsFull(void)//判满
    {
        return N == m_iCnt;
    };
    size_t Count()//当前长度
    {
        return m_iCnt;
    };
};

特殊的栈.

每个函数的逻辑代码没什么好解释的吧。
重点是 template ,首先你忽略这行代码。这叫模板,只理解代码你不需要管。
你只要知道“T”是一个数据类型,“N”是一个整数表示个数。
你可以简单认为T是int,N是100。这段代码就是说这个容器里最多可以容纳100个int型整数,相当于 int a[100];

最后:模板的目的是你可以让这个容器存放其他类型数据,比如T是char型,N是26个。 T是一个自己写的结构类型,N是5个啊什么的。