C++ 堆栈模板不使用';编译推送函数

C++ 堆栈模板不使用';编译推送函数,c++,templates,g++,stack,C++,Templates,G++,Stack,我写了一些类似于堆栈数据结构的东西: template<class T> class Stos { class Element { public: T n; Element* prev; Element(const T& k = 0): n(k), prev(0) {} }; Element* member; Stos(Stos&); public: Sto

我写了一些类似于堆栈数据结构的东西:

template<class T>
class Stos {
    class Element {
        public:
        T n;
        Element* prev;
        Element(const T& k = 0): n(k), prev(0) {}
    };
    Element* member;
    Stos(Stos&);
    public:
    Stos(const T&);
    ~Stos();
    unsigned int count;
    T get();
    Element* push(const T&);
    T pop();
    void mod(const T&);
};
模板
Stos类{
类元素{
公众:
T n;
元素*prev;
元素(常数T&k=0):n(k),prev(0){
};
元素*成员;
Stos(Stos&);
公众:
Stos(常数T&);
~Stos();
无符号整数计数;
T get();
元素*push(常数T&);
T pop();
无效模式(常数T&);
};
和实施(同一文件):

模板
Stos::Stos(常数T&n=0):计数(1){
成员=新元素(n);
}
模板
T Stos::get(){
返回成员->n;
}
模板
Stos::元素*Stos::推送(常量T&n=0){
元素*点=成员;
成员=新元素;
成员->上一个=点;
如果(n!=0)成员->n=n;
++计数;
返回成员;
}
模板
T Stos::pop(){
元素*点=成员;
T n=点->n;
成员=点->上一个;
--计数;
删除点;
返回n;
}
模板
无效Stos::mod(常数T&n){
成员->n=n;
}
模板
Stos::~Stos(){
while(成员)pop();
}
当我尝试用g++编译它时,我得到了关于
Stos::Element*Stos::push()
在“*”标记之前预期的构造函数、析构函数或类型转换的第一行定义的错误。这是我第一次尝试用模板写东西。这个堆栈代码在没有模板的情况下也可以工作,当我编辑它时,我得到了一个错误,在使用“int”而不是“T”之前,一切都很好


我不知道为什么它不能编译。我不能使用指向class::member的指针吗?

您需要在名称
元素
前面加上
类型名

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 
typename Stos::Element*Stos::push(const T&n=0)
这里有一个链接,可以完整解释为什么这是必要的


你也应该考虑使用

const T &n = T()
而不是

const T &n = 0

因为不是所有可能的T都能从0初始化

STACKOFFAST应该在问题是标记C++和“模板”和“编译”的时候自动设置“您需要键入”,即使“VS中的端口”包含在问题的某个地方:-我相信我不应该让使用推()而不带未知的t的参数;
const T &n = 0