创建链接列表,模板化堆栈

时间:2012-05-17 14:11:30

标签: c++

我正在尝试编译我的教师给我们的代码(必须重新键入它,但我找不到任何拼写错误)并且它不会编译。我们将使用此代码进行后续分配,因此我希望在到达之前使其工作。

它应该简单地创建一个基于链表的堆栈。我理解代码是如何工作的,之前我已经完成了模板,但我无法弄清楚它为什么不能编译。

First Stack.h

#ifndef STACK_H
#define STACK_H
//Stack definition file
//Stack.h



template<class ItemType>
struct NodeType<ItemType>; //Line 9



template<class ItemType>
class StackType {
public:
    StackType();
    ~StackType();
    void MakeEmpty();
    void Push(ItemType);
    void Pop(ItemType &);
    bool IsEmpty() const;
    bool IsFull() const;
    ItemType Top();

private:
    NodeType* topPtr;
};


template<class ItemType>
struct NodeType<ItemType> {
    int info;
    NodeType<ItemType>* next;
}; //Line 34

#include "Stack.cpp"

#endif

Stack.cpp

//Stack implemenation
#include <iostream>

template<class ItemType>
StackType<ItemType>::StackType() { //Line 5
    topPtr=NULL;
}


template <class ItemType>
StackType<ItemType>::~StackType() { //Line 11
    MakeEmpty();
}



template <class ItemType>
void StackType<ItemType>::MakeEmpty() {
    NodeType<ItemType>* tempPtr;

    while (topPtr != NULL) {
        tempPtr = topPtr;
        topPtr = topPtr->next;
        delete tempPtr;
    }
}

template <class ItemType>
void StackType<ItemType>::Pop(ItemType & item) {

    NodeType<ItemType>* tempPtr;
    item = topPtr->info;
    tempPtr = topPtr;
    topPtr = topPtr->next;
    delete tempPtr;
}

template<class ItemType>
void StackType<ItemType>::Push(ItemType item) {
    NodeType<ItemType>* location;
    location = new NodeType<ItemType>;
    location->info = newItem;
    location->next = topPtr;
    topPtr = location;
}

template <class ItemType>
bool StackType<ItemType>::IsEmpty() const {
    return (topPtr=NULL);
}

template <class ItemType>
bool StackType<ItemType>::IsFull() const {
    return (false);
}

template<class ItemType>
ItemType StackType<ItemType>::Top() {
        return topPtr->info;
}

和main.cpp

#include <iostream>
#include "Stack.h"
using namespace std;

int main () {

    int whatever;
    StackType<int> s;
    s.Push(10);
    s.Push(1);
    s.Pop(whatever);
    return 0;

}

我得到的错误是

  

c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.h(9):
    错误C2143:语法错误:缺少';'在'&lt;'之前   c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.h(9):
    错误C2059:语法错误:'&lt;'
  c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.h(34):
    错误C2753:'NodeType':部分特化不能匹配主模板的参数列表
   Stack.cpp
  c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(5):
    错误C2143:语法错误:缺少';'在'&lt;'之前   c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(5):
    错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int
  c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(5):
    错误C2988:无法识别的模板声明/定义
  c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(5):
    错误C2059:语法错误:'&lt;'
  C:\用户\ geldhart \保管箱\ cs210 \堆\ stack.cpp(11):
    错误C2588:'::〜StackType':非法的全局析构函数
  c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(11):
    致命错误C1903:无法从之前的错误中恢复;停止编译

1 个答案:

答案 0 :(得分:3)

此语法

template<class ItemType>
struct NodeType<ItemType>; //Line 9

可能部分专门化一些现有的NodeType

要(转发)声明类型,您只需要

template<class ItemType>
struct NodeType;