c++ - 堆栈模板不编译推送功能

标签 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:
    Stos(const T&);
    ~Stos();
    unsigned int count;
    T get();
    Element* push(const T&);
    T pop();
    void mod(const T&);
};

和实现(同一个文件):

template<class T>
Stos<T>::Stos(const T& n = 0): count(1) {
    member = new Element(n);
}

template<class T>
T Stos<T>::get() {
    return member->n;
}

template<class T>
Stos<T>::Element* Stos<T>::push(const T& n = 0) {
    Element* point = member;
    member = new Element;
    member->prev = point;
    if(n != 0) member->n = n;
    ++count;
    return member;
}

template<class T>
T Stos<T>::pop() {
    Element* point = member;
    T n = point->n;
    member = point->prev;
    --count;
    delete point;
    return n;
}

template<class T>
void Stos<T>::mod(const T& n) {
    member->n = n;
}

template<class T>
Stos<T>::~Stos() {
    while(member) pop();
}

当我尝试用 g++ 编译它时,我得到关于 Stos::Element* Stos::push() 定义的第一行的错误:expected constructor, destructor , 或在 '*' 标记之前进行类型转换。这是我第一次尝试用模板写东西。这个堆栈代码在没有模板的情况下确实可以工作,当我编辑它时,我得到了错误,之前一切正常,到处都是“int”而不是“T”。

而且我无法找出它无法编译的原因。我不能使用指向 class::member 的指针吗?

最佳答案

您需要在名称 Element 前加上 typename

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 

这里有一个链接,可以完整解释为什么这是必要的

关于c++ - 堆栈模板不编译推送功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218878/

相关文章:

c++ - Windows XP 上的 GDI+ 问题

c++ - C++命令行软件

c++ - builder 模式、模板和嵌套类

javascript - 使用 Javascript 更改 'views' 的最佳方法是什么?

c++ - 使用多个文件制作和编译 C++ 项目

c++ - 如何在 g++ 中使用 "use unicode character set"?

C++ SFML Sprite 运动没有按预期工作

java - 解析后除草

c++ - 为什么这个交换函数调用不明确?

c++ - 无法识别 g++ 文件格式;将 Object.o 视为链接描述文件