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 に答える