注册 登录
编程论坛 C++教室

为什么会出现这个问题呀

淡雅蜻蜓 发布于 2010-11-26 19:50, 975 次点击
error C2371: 'bool' : redefinition; different basic types
头文件1.h
const int maxSize=50;
 enum bool {false,true};
template<class T>
class Queue{
public:
    Queue(){};
    ~Queue(){};
    virtual void EnQueue(const T& x)=0;
    virtual bool DeQueue(T& x)=0;
    virtual bool getFront(T& x)=0;
    virtual bool  IsEmpty()const=0;
    virtual bool IsFull()const=0;
    virtual int getSize()const=0;
};
头文件sequeue.h
template<class T>
class SeQueue:public Queue<T>{
    public:
        SeQueue(int sz=10);
        ~SeQueue(){delete[] elements;}
        bool int  DeQueue(T& x);
        bool getFront(T& x);
        void makeEmpty(){front=rear=0;}
        bool  IsEmpty()const{return(front==rear)?true:false;}
        bool  IsFull()const{return((rear+1)%maxSize==front)?true:false;}
        int getSize()const{return(rear-front+maxSize)%maxSize;}
        friend ostream& operator <<(ostream& os,SeQueue<T>& Q)
        {protected:
        int rear,front;
        T *elements;
        int maxSize;
        };
源文件
#include<assert.h>
#include<iostream.h>
#include"1.h"
#include"sequeue.h"

 template<class T>
     SeQueue<T>::SeQueue(int sz):front(0),rear(0),maxSize(0){
     elements=new T[maxSize];
     assert (elements!=NULL);
 };//建立空队列

template<class T>
     bool SeQueue<T>::EnQueue(const T& x){
     if (IsFull()==true) return false;
     elements[rear]=x;
     rear=(rear+1)%maxSize;
     return true;
};//入队


template<class T>
     bool SeQueue<T>::DeQueue(const T& x){
     if (IsEmpty()==true) return false;
     x=elements[front];
     front=(front+1)%maxSize;
     return true;
};//出队


template<class T>
     bool SeQueue<T>::DeQueue(const T& x){
     if (IsEmpty()==true) return false;
     x=elements[front];
     return true;
};//取对头


template<class T>
ostream& operator <<(ostream& os,SeQueue<T>& Q){
    os<<"front="<<Q.front<<",rear="<<Q.rear<<endl;
    for(int i=front;i!=rear;i=(i+1)%maxSize;)
        os<<i<<":"<<Q.elements[i]<<endl;
    return os;
};//元素的重载




void main()
{   
    int maxSize,number,select=5;
    char s;
    cout<<"\n请输入对的大小:"<<endl;
    cin>>maxSize;
    Queue<char> Queue(maxSize);
    while(select!=4)
     {
        cout<<"\n\t\t\t************操作菜单*****************\n";
        cout<<"\t\t\t\t 1 入队"<<endl;
        cout<<"\t\t\t\t 2 出队"<<endl;
        cout<<"\t\t\t\t 3 取队头元素"<<endl;
        cout<<"\t\t\t\t 4 退出"<<endl;
        cout<<"\t\t\t************请选择序号*****************\n";
        cin>>select;
        switch(select)
        {
         case 1:
            cout<<"请输入一个队列并以.结束"<<endl;
            cin>>s;
            while(s!='.')
            {
         SeQueue.EnQueue(s);
              cin>>s
             }
            break;
         case 2:
             cout<<"请输入出队字符数:";
             cin>>number;
             cout<<"\n出队元素依次为:";
             for(int i=0;i<number;i++)
               if (Se!Queue.IsEmpty()) cout<<SeQueue.DeQueue()<<"  ";
             break;
         case 3:
             if (SeQueue.IsEmpty()){cout<<"队空"<<endl;break;}
             cout<<"队头元素为:"<<SeQueue.getFront();
             break;
         case 4:
             break;
        }
     }
       cout<<"谢谢使用"<<endl;
}


   
   


12 回复
#2
玩出来的代码2010-11-26 20:21
这个你将枚举变量的名字改下试试,MS是bool的类型引起的,C++有内置bool类型的
#3
淡雅蜻蜓2010-11-26 20:26
回复 2楼 玩出来的代码
你的具体意思是?
#4
玩出来的代码2010-11-26 20:36
MS这个行不通的。enum bool {false,true};
#5
淡雅蜻蜓2010-11-26 21:08
回复 4楼 玩出来的代码
那要怎么改?
#6
玩出来的代码2010-11-26 21:53
LZ啊,该怎么说呢,你是否见过如下的形式。在写程序前你应该将一些基本的语法掌握。另外你也应该学会自己调试,错误小多,给你改下,仅限与编译没问题,其他的问题逻辑非逻辑,运行时的什么就不看了,你自己琢磨吧。还有你用的时模板的分离编译,估计你的编译器也不支持。详解google模板的分离编译。呃,纯虚基类~~~要用好了。
class A
{
public:
    void f(){}
};
int main()
{
    A.f();
    return 0;
}
#7
玩出来的代码2010-11-26 21:59
类声明与实现分开比较好,即使是模板。类实现单独的源文件中
程序代码:

#ifndef HEAD
#define HEAD
const int maxSize=50;
//enum bool {false1,true1};
template<class T>
class Queue{
public:
    Queue(){};
    ~Queue(){};
    virtual bool EnQueue(const T& x)=0;
    virtual bool DeQueue(const T& x)=0;
    virtual bool getFront(const T& x)=0;
    virtual bool  IsEmpty()const=0;
    virtual bool IsFull()const=0;
    virtual int getSize()const=0;
};
#endif


程序代码:

#ifndef HEAD1
#define HEAD1
#include<iostream>
#include"head.h"
using namespace std;

template<class T>
class SeQueue:public Queue<T>{
public:
    SeQueue(int sz=10);
    ~SeQueue(){delete []elements;}
    bool   DeQueue(const T& x);
    bool  EnQueue(const T&);
    bool getFront(T& x);
    void makeEmpty(){front=rear=0;}
    bool  IsEmpty()const{return(front==rear)?true:false;}
    bool  IsFull()const{return((rear+1)%maxSize==front)?true:false;}
    int getSize()const{return(rear-front+maxSize)%maxSize;}
    friend ostream& operator <<(ostream& os,SeQueue<T>& Q);
protected:
    int rear,front;
    T *elements;
    int maxSize;
};
#endif


程序代码:

#include<assert.h>
#include<iostream>
#include"head.h"
#include"head1.h"
using namespace std;

int main()
{   
    SeQueue<char> s;
    return 0;
}
#8
玩出来的代码2010-11-26 22:00
哎,少了个。
程序代码:

#include<iostream>
#include<cassert>
#include"head1.h"
using namespace std;


template class SeQueue<char>;

template<class T>
SeQueue<T>::SeQueue(int sz):front(0),rear(0),maxSize(0){
    elements=new T[maxSize];
    assert (elements!=NULL);
};//建立空队列

template<class T>
bool SeQueue<T>::EnQueue(const T& x){
    if (IsFull()==true) return false;
    elements[rear]=x;
    rear=(rear+1)%maxSize;
    return true;
};//入队


template<class T>
bool SeQueue<T>::DeQueue(const T& x){
    if (IsEmpty()==true) return false;
//    x=elements[front];
    front=(front+1)%maxSize;
    return true;
};//出队


template<class T>
bool SeQueue<T>::getFront(T& x){
    if (IsEmpty()==true) return false;
    x=elements[front];
    return true;
};//取对头


template<class T>
ostream& operator <<(ostream& os,SeQueue<T>& Q){
    os<<"front="<<Q.front<<",rear="<<Q.rear<<endl;
    for(int i=front;i!=rear;i=(i+1)%maxSize;)
        os<<i<<":"<<Q.elements[i]<<endl;
    return os;
};//元素的重载
#9
玩出来的代码2010-11-26 22:02
那个bool的事,C++中有bool类型无需在定义同样的类型而不用C++内部的bool。删除元素那若要取得删除的元素将形参定义为非const ,

[ 本帖最后由 玩出来的代码 于 2010-11-26 22:03 编辑 ]
#10
pangding2010-11-26 23:17
bool 是关键字,不能自己用来定义。
#11
淡雅蜻蜓2010-11-26 23:25
回复 9楼 玩出来的代码
哥哥  你用什么软件编译的哇   为毛我的6.0出不来呢
#12
玩出来的代码2010-11-26 23:52
VC6.0?我用的VS2008,不过刚才在VC6下试了下,编译->链接->运行.没问题的。你的出不来是什么意思?
#13
淡雅蜻蜓2010-11-26 23:54
回复 12楼 玩出来的代码
我试试看   哈
1