我想编译我的教师给我们的代码(不得不重新键入它,但我找不到任何拼写错误),它不会编译。我们将使用此代码进行后续分配,因此我们希望在我们到达之前使其工作。创建链接列表,模板化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:无法从先前的错误中恢复;正在停止编译
Stack.h:'#包括 “Stack.cpp”' - 你能肯定吗? – smocking
@smocking:这样可以,因为'Stack.cpp'只包含模板代码。我会称之为'Stack.impl'或类似的东西,但那只是我。 –
@smocking它实际上是模板代码所必需的,包含该头文件的每个cpp文件都必须包含实现该模板的cpp文件,因为模板由编译器转换。我也同意使用.impl – lassombra