2012-05-17 64 views
1

我想编译我的教师给我们的代码(不得不重新键入它,但我找不到任何拼写错误),它不会编译。我们将使用此代码进行后续分配,因此我们希望在我们到达之前使其工作。创建链接列表,模板化Stack

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

首先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:语法错误:缺少';'前 '<'
C:\用户\ geldhart \保管箱\ cs210 \堆\ stack.h(9):
错误C2059:语法错误: '<'
C:\用户\ geldhart \保管箱\ cs210 \堆\ stack.h(34):
错误C2753: '的NodeType':偏特不能匹配主模板
Stack.cpp
ç参数列表:\用户\ geldhart \保管箱\ cs210 \堆\ stack.cpp (5):
错误C2143:语法错误:缺少';' '<'
c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(5):
错误C4430:缺少类型说明符 - int假定。注意:C++不支持默认int
C:\用户\ geldhart \保管箱\ cs210 \堆\ stack.cpp(5):
错误C2988:不能识别的模板声明/定义
C:\用户\ geldhart \收存箱\ cs210 \堆\ stack.cpp(5):
错误C2059:语法错误: '<'
C:\用户\ geldhart \保管箱\ cs210 \堆\ stack.cpp(11):
错误C2588 :'::〜StackType':非法全局析构函数
c:\ users \ geldhart \ dropbox \ cs210 \ stack \ stack.cpp(11):
致命错误C1903:无法从先前的错误中恢复;正在停止编译

+0

Stack.h:'#包括 “Stack.cpp”' - 你能肯定吗? – smocking

+0

@smocking:这样可以,因为'Stack.cpp'只包含模板代码。我会称之为'Stack.impl'或类似的东西,但那只是我。 –

+0

@smocking它实际上是模板代码所必需的,包含该头文件的每个cpp文件都必须包含实现该模板的cpp文件,因为模板由编译器转换。我也同意使用.impl – lassombra

回答

3

这句法

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

将可能是部分专业存在的一些NodeType

要(向前)声明的类型,你只需要

template<class ItemType> 
struct NodeType; 
+0

的样式设计有一个类似的问题,其结构在Stack.h – Fraser

+0

的脚下定义,并且在Stack.cpp中定义了几次。它看起来像有人试图将java泛型转换为C++模板,只有在类或结构标签之后包含的情况下,如果ItemType是要为其专门化结构或类的另一个类的标识符。 – lassombra

+0

谢谢,我现在有它的工作,我发现了一些其他问题,现在它工作。 课:教授并不总是对的。 – Geldhart