类模板已经定义,需要模板参数列表?

sjk1996 2016-12-08 08:12:22
# include<iostream>
using namespace std;
template <class T>
class SeqQueue{
private:
T* elements; //存放队列元素的数组
int rear,front; //队尾指针和对头指针
int maxSize; //队列可容纳的最大元素个数
public:
SeqQueue(int sz):rear(0),front(0),maxSize(sz){
elements=new T[maxSize];
}
~ SeqQueue(){ delete[]elements;} //析构函数
bool EnQueue(const T& x){ //进队函数
if(isFull()) return false;
else
elements[rear]=x;
rear=(rear+1)%maxSize; //加一再取余是为了rear指向队列最后一个元素(下标maxSize-1),再进一下标就到了0
return true;
}
bool DeQueue(T& x){
if(isEmpty()) return false;
else
x=elements[front];
front=(front+1)%maxSize;
return true;
}
bool getFront(T& x){
if(isEmpty()) return false;
else
x=elements[front];
return true;
}
void makeEmpty(){front=rear=0;} //把队置空
bool isEmpty(){ return (front==rear)?true:false; } //判断队空
bool isFull(){ return ((rear+1)%maxSize==front)?true:false; } //判断队满
int getSize(){ return (rear-front+maxSize)%maxSize; } //求队中元素个数
friend ostream& operator<<(ostream& ostr,SeqQueue<T>& Q); //输出运算符重载
};
template<class T>
ostream& operator<<(ostream& ostr,SeqQueue<T>& Q){
ostr<<"front="<<Q.front<<" "<<"rear="<<Q.rear<<endl;
for(int i=Q.front;i!=Q.rear;i=(i+1)%Q.maxSize)
ostr<<i<<": "<<Q.elements[i]<<endl;
return ostr;
}



请帮我解答一下
...全文
1190 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-12-09
  • 打赏
  • 举报
回复
问题解决了吗,下次回帖记得引用我的回复,否则我看不到
sjk1996 2016-12-08
  • 打赏
  • 举报
回复
还有,模板类不可以声明写在头文件而实现函数写在cpp文件里吗?
如果不写主函数的话编译器能编译通过,编译器显示:

添加主函数后,编译器显示:

可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:

这又是怎么回事呢?
sjk1996 2016-12-08
  • 打赏
  • 举报
回复
我想实现双端队列,继承循环队列的代码,以减少代码的重复编写。但是却遇到了以下问题,以下是我写的代码 1.SeqQueue.h
# include<iostream>
using namespace std;
template <class T>
class SeqQueue{
private:
	T* elements;              //存放队列元素的数组
	int rear,front;           //队尾指针和对头指针
	int maxSize;              //队列可容纳的最大元素个数
public:
	SeqQueue(int sz);          //构造函数
	~ SeqQueue(){ delete[]elements;}    //析构函数
	bool EnQueue(const T& x);         //进队函数
	bool DeQueue(T& x);               //出队函数
	bool getFront(T& x);             //取队头元素
	void makeEmpty(){front=rear=0;}     //把队置空
	bool isEmpty(){return (front==rear)?true:false;}    //判断队空
	bool isFull(){return ((rear+1)%maxSize==front)?true:false;}    //判断队满
	int getSize(){return (rear-front+maxSize)%maxSize;}            //求队中元素个数
	friend ostream& operator<<(ostream& ostr,SeqQueue<T>& Q);        //输出运算符重载
};
template<class T>
SeqQueue<T>::SeqQueue(int sz):rear(0),front(0),maxSize(sz){
	elements=new T[maxSize];
	assert(elements!=NULL); //断言机制:如果不满足括号内条件将终止程序的执行
}
template<class T>
bool SeqQueue<T>::EnQueue(const T& x){
	if(isFull()) return false;
	else 
		elements[rear]=x;
	    rear=(rear+1)%maxSize; //加一再取余是为了rear指向队列最后一个元素(下标maxSize-1),再进一下标就到了0
	return true;
}
template<class T>
bool SeqQueue<T>::DeQueue(T& x){
	if(isEmpty()) return false;
	else
		x=elements[front];
	    front=(front+1)%maxSize;
	return true;
}
template<class T>
bool SeqQueue<T>::getFront(T& x){
	if(isEmpty())  return false;
	else
		x=elements[front];
	return true;
}
template<class T>
ostream& operator<<(ostream& ostr,SeqQueue<T>& Q){
	ostr<<"front="<<Q.front<<" "<<"rear="<<Q.rear<<endl;
	for(int i=Q.front;i!=Q.rear;i=(i+1)%Q.maxSize)
		ostr<<i<<": "<<Q.elements[i]<<endl;
	return ostr;
}
2.SeqDeque.h
# include"SeqQueue.h"
# include<iostream>
using namespace std;
template <class T>
class SeqDeque:public SeqQueue<T>{
private:
	int front,rear;
	int maxSize;
	T *elements;
public:
	SeqDeque(int sz){   //构造函数
		SeqQueue<T>::SeqQueue(sz);
	}
	~SeqDeque(){       //析构函数
		delete[]elements;
	}
	bool getHead(T& x){      //取队头
		return SeqQueue<T>::getFront(x);

	}
	bool getTail(T& x);       //取队尾
	bool EnQueueHead(const T& x);        //从队头进队
	bool EnQueueTail(const T& x){           //从队尾进队
		return SeqQueue<T>::EnQueue(x); 
	}
	bool DeQueueHead(T& x){           //从队头出队
		return SeqQueue<T>::DeQueue(x);
	}
	bool DeQueueTail(T& x);          //从队尾出队
	bool isEmpty(){                           //判断队空
		return (front==rear)?true:false;
	}
	bool isFull(){               //判断队满
		return SeqQueue<T>::isFull();
	}
	void makeEmpty(){         //把队置空
		front=rear=0;
	}
	int getSize(){           //求队列元素个数
		return (rear-front+maxSize)%maxSize;
	}
	friend ostream& operator<<(ostream& ostr,SeqDeque<T>& D);       //输出运算符重载
}; 
template <class T>
bool SeqDeque<T>::getTail(T& x){
	if(isEmpty()) return false;
	else{
		x=elements[(rear-1+maxSize)%maxSize];
		return true;
	}
}
template <class T>
bool SeqDeque<T>::EnQueueHead(const T& x){
	if(isFull()) return false;
	else{
		front=(front-1+maxSize)%maxSize;
		elements[front]=x;
		return true;
	}
}
template <class T>
bool SeqDeque<T>::DeQueueTail(T& x){
	if(isEmpty()) return false;
	else{
		rear=(rear-1+maxSize)%maxSize;
		x=elements[rear];
		return true;
	}
}
template <class T>
ostream& operator<<(ostream& ostr,SeqDeque<T>& D){
	ostr<<"front="<<D.front<<" "<<"rear="<<D.rear<<endl;
	for(int i=D.front;i!=D.rear;i=(i+1)%D.maxSize)
		ostr<<i+1<<": "<<D.elements[i]<<endl;
	return ostr;
}
		

3.主函数:
# include"SeqDeque.h"
# include<iostream>
using namespace std;
int main (){
	int a,n=5;
	SeqDeque<int> D(10);
	cout<<"please enter the date into Queue"<<endl;
	while(n--){
		cin>>a;
		D.EnQueueTail(a);
	}
	cout<<D<<endl;
	system("pause");
	return 0;
}
请帮我解答一下,谢谢!
paschen 版主 2016-12-08
  • 打赏
  • 举报
回复
那你主函数是什么??

65,186

社区成员

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

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