build时出错:error C2143: syntax error : missing ';' before '<'

芝麻开门IT 2013-04-07 04:35:25
仿照《C++数据结构原理与经典问题求解》编写了一个Cpp加密程序,运用双向链表结构,编译时无报错,但是在build时出现一大堆莫名其妙的问题,恳请各位帮忙看一下,程序如下:
"DouList.h":
template <class T> class DouList
{
DouListNode<T>* head;
DouListNode<T>* tail;
DouListNode<T>* cur;
public:
DouList();
~DouList(){};
bool AddTail(T value);
bool AddHead(T value);
void RemoveThis(bool direction);
void RemoveALL();
void SetBegin();
int GetCount();
void TowardCur();
void BackCur();
DouListNode<T>* GetCur();
DouListNode<T>* GetHead();
DouListNode<T>* GetTail();
void InsertAfter(T value);
bool IsEmpty();
T GetNext();
T GetPrior();
};


"DouListNode.h":
template <class T> class DouListNode
{
T data;
DouListNode<T>* link;//后继
DouListNode<T>* prior;//私有//前驱
public:
DouListNode() :link(NULL),prior(NULL){};
DouListNode(T value) :link(NULL),prior(NULL),data(value){};
~DouListNode() {};
void SetLink(DouListNode<T>* next);
void SetPrior(DouListNode<T>* pre);
DouListNode<T>* GetLink();
DouListNode<T>* GetPrior();
T& GetData();
};


"DouList.cpp":
#include "DouList.h"
//双向链表类的实现
using namespace std;

template <class T>
DouList<T>::DouList()//默认构造函数
{
head=tail=new DouListNode<T>;
cur=NULL;
head->SetLink(head);//创建初始循环
head->SetPrior(tail);
}

template <class T>
bool DouList<T>::AddTail(T value)//表尾插入一个新结点,结点存储的数据由value决定
{
DouListNode<T>* add=new DouListNode<T>(value);////////注意格式
tail->SetLink(add);//使新结点为表尾结点的后继结点
add->SetPrior(tail);
tail=tail->GetLink();
tail->SetLink(head);//表尾指向表头
head->SetPrior(add);//表头结点的前驱为表尾

if(tail!=NULL)
{
return true;
}
else
return false;
}

template <class T>
bool DouList<T>::AddHead(T value)//表头结点与第一个结点间插入新结点
{
DouListNode<T>* add=new DouListNode<T>(value);
add->SetPrior(head);
add->SetLink(head->GetLink());
head->GetLink()->SetPrior(add);//原来第一个结点的前驱指向新插入的结点
head->SetLink(add);
//若是对空链表插入新结点,则应该更新尾指针
if(tail==head)
{
tail=head->GetLink();
}
if(add!=NULL)
{
return true;
}
else
return false;
}

template <class T>
void DouList<T>::RemoveThis(bool direction)//将当前cur指向的结点删除,删除后cur移动方向由direction决定
{
if(cur==head)//若当前cur位于表头处,则顺序移动cur
{
if(0==direction)//direction=0则朝link方向移动
cur=cur->GetLink();
if(1==direction)//direction=1则朝prior方向移动
cur=cur->GetPrior();
}

DouListNode<T>* preCur=NULL;
DouListNode<T>* nextCur=NULL;
preCur=cur->GetPrior();
nextCur=cur->GetLink();
preCur->SetLink(cur->GetLink());
nextCur->SetPrior(cur->GetPrior());

if(0==direction)
{
cur=nextCur;
}
if(1==direction)
{
cur=preCur;
}

template <class T>
void DouList<T>::RemoveAll()//删除所有结点,保留表头结点
{
SetBegin();//从头开始删除
int length=GetCount();//双向链表长度
for(int i=0;i<length;i++)
{
RemoveThis(0);
}
cur=head;
}

template <class T>
void DouList<T>::SetBegin()//置cur于表头处
{
cur=head;
}

template <class T>
int DouList<T>::GetCount()//获取链表结点个数,不计表头结点
{
int num=0;
DouLinkNode<T>* here=cur;
while(cur->GetLink()!=here)
{
cur=cur->GetLink();
++num;
}
cur=cur->GetLink();
return num;
}

template <class T>
void DouList<T>::TowardCur()//将cur朝link方向移动
{
cur=cur->GetPrior();
}

template <class T>
void DouList<T>::BackCur()//将cur朝prior方向移动
{
cur=cur->GetPrior();
}

template <class T>
DouListNode<T>* DouList<T>::GetCur()//获取指针cur
{
return cur;
}

template <class T>
DouListNode<T>* DouList<T>::GetHead()//获取头指针
{
return head;
}

template <class T>
DouListNode<T>* DouList<T>::GetTail()//获取尾指针
{
return tail;
}

template <class T>
bool DouList<T>::IsEmpty()//判断链表是否为空,是否仅有表头结点
{
return head->GetLink()==head;
}

template <class T>
void DouList<T>::InsertAfter(T value)
{
DouListNode<T>* add=new DouListNode<T>(value);
DouListNode<T>* nextCur=cur->GetLink();
cur->SetLink(add);
add->SetLink(nextCur);
nextCur->SetPrior(add);
add->SetPrior(cur);

if(cur==tail)
{
tail=cur->GetLink();
}
}

template <class T>
T DouList<T>::GetNext()//获取cur指向的结点数据,并将cur向link方向移动
{
if(cur==head)
cur=cur->GetLink();
T num=cur->GetData();
cur=cur->GetLink();
return num;
}

template <class T>
T DouList<T>::GetPrior()//获取cur指向的结点数据,并将cur向prior方向移动
{
if(cur==head)
cur=cur->GetPrior();
T num=cur->GetData();
cur=cur->GetPrior();
return num;
}

}


"DouListNode.cpp":
#include "DouListNode.h"//
using namespace std;

template <class T>
void DouLinkNode<T>::SetLink(DouLinkNode<T>* next) //设置link值
{
link=next;
}

template <class T>
void DouListNode<T>::SetPrior(DouListNode<T>* pre)//设置prior值
{
prior=pre;
}

template <class T>
DouListNode<T>* DouListNode<T>::GetLink()//返回指向当前结点的后继结点的指针
{
return link;
}

template <class T>
DouListNode<T>* DouListNode<T>::GetPrior()//返回指向当前结点的前驱结点的指针
{
return prior;
}

template <class T>
T& DouListNode<T>::GetData()//返回结点中保存的数据
{
return data;
}


"main.cpp":

#include "DouListNode.h"
#include "DouList.h"
//#include "Iterator.h"
#include "ctime"
#include <string>
#include <list>
#include <iostream>
using namespace std;
void main()
{
srand((unsigned)time(NULL));//?
DouList<char> planText;//
DouList<char> cryptograph;
DouList<int> key;
DouList<char> trans;
planText.SetBegin();
planText.AddTail('Y');
planText.AddTail('o');
planText.AddTail('u');
planText.AddTail('a');
planText.AddTail('r');
planText.AddTail('e');
planText.AddTail('i');
planText.AddTail('n');
planText.AddTail('d');
planText.AddTail('a');
planText.AddTail('n');
planText.AddTail('g');
planText.AddTail('e');
planText.AddTail('r');
planText.AddTail('!');
planText.SetBegin();
cout<<"明文:"<<'\t';
for(int z=0;z<planText.GetCount();z++)
cout<<planText.GetNext()<<"*";
cout<<endl<<endl;
key.SetBegin();//产生密钥链表
for(int i=0;i<6;i++)
key.AddTail(rand()%50);
cout<<"密钥:"<<'\t';
for(i=0;i<key.GetCount();i++)
cout<<key.GetNext()<<"*";
cout<<endl<<endl;//?????
planText.SetBegin();
key.SetBegin();
cryptograph.SetBegin();
for(i=0;i<planText.GetCount();i++)
cryptograph.AddHead(key.GetNext()+planText.GetNext());
cryptograph.SetBegin();
cout<<"密文:"<<'\t';
for(int k=0;k<cryptograph.GetCount();k++)
cout<<cryptograph.GetNext();
cout<<endl<<endl;//?????
trans.SetBegin();
planText.SetBegin();
key.SetBegin();
for(i=0;i<planText.GetCount();i++)
trans.AddHead(cryptograph.GetPrior()-key.GetNext());
trans.SetBegin();
cout<<"解密后:"<<'\t';
for(k=0;k<trans.GetCount();k++)
cout<<trans.GetPrior();
cout<<endl<<endl;//
}

出错提示:
error C2143: syntax error : missing ';' before '<'
error C2501: 'DouListNode' : missing storage-class or type specifiers
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
error C2501: 'DouListNode' : missing storage-class or type specifiers
error C2238: unexpected token(s) preceding ';'
error C2238: unexpected token(s) preceding ';'
.
.
.
...全文
157 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
芝麻开门IT 2013-04-08
  • 打赏
  • 举报
回复
芝麻开门IT 2013-04-07
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
带模板的不能分离为.h和.cpp文件,把它们合并一个.h中即可。

谢谢哈。我重新建了工程,把DouList.cpp添加到DouList.h中,把DouListNode.cpp添加到DouListNode.h中,但是现在在编译的时候就出好多错误:

图灵狗 2013-04-07
  • 打赏
  • 举报
回复
带模板的不能分离为.h和.cpp文件,把它们合并一个.h中即可。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧