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

时间:2022-08-27 21:50:55
# 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;
}


类模板已经定义,需要模板参数列表?
请帮我解答一下

4 个解决方案

#1


那你主函数是什么??

#2


我想实现双端队列,继承循环队列的代码,以减少代码的重复编写。但是却遇到了以下问题,以下是我写的代码
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;
}

类模板已经定义,需要模板参数列表?
请帮我解答一下,谢谢!

#3


还有,模板类不可以声明写在头文件而实现函数写在cpp文件里吗?
如果不写主函数的话编译器能编译通过,编译器显示:
类模板已经定义,需要模板参数列表?
添加主函数后,编译器显示:
类模板已经定义,需要模板参数列表?
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
类模板已经定义,需要模板参数列表?
这又是怎么回事呢?

#4


问题解决了吗,下次回帖记得引用我的回复,否则我看不到

#1


那你主函数是什么??

#2


我想实现双端队列,继承循环队列的代码,以减少代码的重复编写。但是却遇到了以下问题,以下是我写的代码
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;
}

类模板已经定义,需要模板参数列表?
请帮我解答一下,谢谢!

#3


还有,模板类不可以声明写在头文件而实现函数写在cpp文件里吗?
如果不写主函数的话编译器能编译通过,编译器显示:
类模板已经定义,需要模板参数列表?
添加主函数后,编译器显示:
类模板已经定义,需要模板参数列表?
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
类模板已经定义,需要模板参数列表?
这又是怎么回事呢?

#4


问题解决了吗,下次回帖记得引用我的回复,否则我看不到