8

尝试编译以下类时出现错误

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;
      }
 }
4

5 回答 5

12

您正在声明一个模板类。您可以:

  • 类声明中实现析构函数,像这样

    public:
        Stack(): head(NULL) {};
        ~Stack() {
            // ...
        }
    
  • 在类声明之外定义模板化析构函数,像这样

    template <class T>
    Stack<T>::~Stack()
    {
        // ...
    }
    

但是,如果您尝试定义,Stack::~Stack()那么编译器将不知道T您正在为哪种类型实现析构函数。

于 2013-05-21T01:58:13.183 回答
6
template<typename T>
Stack<T>::~Stack()
{
    //...
}

这通常适用于您在类声明之外定义的每个方法,而不仅仅是析构函数。

于 2013-05-21T01:56:45.317 回答
5
 Stack::~Stack()

应该

template <typename T>
Stack<T>::~Stack()
于 2013-05-21T01:56:32.053 回答
4

如果将函数放在类定义之后,则必须再次指定模板方面,如下所示:

template <class T>
Stack<T>::~Stack()
{
    ...
}

如果您在类中定义函数,则不需要这样做(但这构成了编译器提示以内联您可能关心或不关心的函数)。

于 2013-05-21T01:58:00.437 回答
2

不确定,但也许这样......

template <class T>

Stack<T>::~Stack()

于 2013-05-21T01:59:50.760 回答