【问题标题】:How to declare destructor of a templated class如何声明模板类的析构函数
【发布时间】:2013-05-21 01:54:51
【问题描述】:

尝试编译以下类时出错

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:
      template<typename T>
      Stack<T>::~Stack()
      {
          //...
      }
      

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

      【讨论】:

        【解决方案3】:
         Stack::~Stack()
        

        应该是

        template <typename T>
        Stack<T>::~Stack()
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            不确定,但可能是这样......

            template <class T>

            Stack<T>::~Stack()

            【讨论】:

            • 虽然您的答案是正确的,但如果您不确定,那么您可能不应该发布答案。
            猜你喜欢
            • 1970-01-01
            • 2013-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-24
            • 1970-01-01
            • 2016-02-24
            相关资源
            最近更新 更多