我在尝试编译类
时遇到错误Stack.cpp:28:错误:在'::'标记之前预期的构造函数,析构函数或类型转换
#include <iostream>
using namespace std;
template <class T>
class Stack
{
public:
Stack(): head(NULL) {};
~Stack();
void push(T *);
T* pop();
protected:
class Element {
public:
Element(Element * next_, T * data_):next(next_), data(data_) {}
Element * getNext() const { return next; }
T * value() const {return data;}
private:
Element * next;
T * data;
};
Element * head;
};
Stack::~Stack()
{
while(head)
{
Element * next = head->getNext();
delete head;
head = next;
}
}
答案 0 :(得分:6)
您正在声明模板类。你可以:
在类声明中实现析构函数,就像这个
一样public:
Stack(): head(NULL) {};
~Stack() {
// ...
}
在类声明之外定义模板化析构函数,如此
template <class T>
Stack<T>::~Stack()
{
// ...
}
但是,如果您尝试仅定义Stack::~Stack()
,则编译器不知道您正在为其实现析构函数的类型T
。
答案 1 :(得分:5)
template<typename T>
Stack<T>::~Stack()
{
//...
}
这通常对您在类声明之外定义的每个方法都有效,而不仅仅是析构函数。
答案 2 :(得分:4)
Stack::~Stack()
应该是
template <typename T>
Stack<T>::~Stack()
答案 3 :(得分:4)
如果将函数放在类定义之后,则必须再次指定模板方面,如:
template <class T>
Stack<T>::~Stack()
{
...
}
如果在类中定义函数,则不需要这样做(但这构成了编译器提示,以内联您可能或可能不关心的函数)。
答案 4 :(得分:2)
不确定,但也许这样......
template <class T>
Stack<T>::~Stack()