0

そこで、最近、StackADTのリンクリストベースの実装を作成しました。ただし、スタックのノードの宣言方法に多少の不一致がある理由はよくわかりません。コンパイラは非常に怒り、特定の関数に対して特定の方法で記述するまでコンパイルされません。なぜそうなるのか、私は非常に興味があります。

コンパイラが2つの異なるフォーマットを必要とする2つの異なるメソッドがあります。

これがコンパイラが必要とする私のデストラクタStackNode *tempです。

template <typename DataType>
StackLinked<DataType>::~StackLinked() {
   StackNode *temp;
   while (top != 0) {
       temp = top;
       top = top->next;
       delete temp;
   }
}

これが、コンパイラが必要とする代入演算子のオーバーロードStackNode<DataType> *tempです。

template <typename DataType>
StackLinked<DataType>& StackLinked<DataType>::operator=(const StackLinked& other) {
    if (this != &other) {
        StackNode<DataType> *newNode, *current, *last;

        if (top != 0) {
           StackNode<DataType> *temp;
           while (top != 0) {
               temp = top;
               top -> top->next;
               delete temp;
           }
        }

        if (other.top == 0) {
            top = 0;
        }
        else {
            current = other.top;
            top = new StackNode<DataType>;
            top->dataItem = current->dataItem;
            top->next = 0;
            last = top;
            current = current->next;

            while (current != 0) {
                newNode = new StackNode<DataType>;
                newNode->dataItem = current->dataItem;
                newNode->next = 0;
                last-> next = newNode;
                last = newNode;
                current = current->next;
            }
        }
    }
    return *this;
}

これがなぜなのかはわかりませんが、未知のものが私を悩ませています。

注:私のStackNodeクラスは、StackLinkedクラスの内部クラスです。

編集:クラス宣言:

#ifndef STACKARRAY_H
#define STACKARRAY_H

#include <stdexcept>
#include <iostream>

using namespace std;

#include "Stack.h"

template <typename DataType>
class StackLinked : public Stack<DataType> {

public:

StackLinked(int maxNumber = Stack<DataType>::MAX_STACK_SIZE);
StackLinked(const StackLinked& other);
StackLinked& operator=(const StackLinked& other);
~StackLinked();

void push(const DataType& newDataItem) throw (logic_error);
DataType pop() throw (logic_error);

void clear();

bool isEmpty() const;
bool isFull() const;

void showStructure() const;

private:
class StackNode {
  public:
StackNode(const DataType& nodeData, StackNode* nextPtr);
DataType dataItem;
StackNode* next;
};

StackNode* top;
};

#endif  

その他の詳細が必要な場合。聞いてください!お時間をいただきありがとうございます!

4

1 に答える 1

0

あなたが示したコードから、はクラステンプレートではStackNode<DataType>ないため、正しくありません。StackNode

StackNodeこれにより、コンパイラが検出しているという名前のテンプレートがあると思います。ファイルに別のバージョンのが含まれていないかどうかを確認してくださいStackNode

于 2012-10-28T00:42:58.993 に答える