我写了这个类似栈的数据结构:
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/