一个关于摸板类的问题
类定义queue.h:
#include<iostream>
#include<string>
using namespace std;
class Employee
{
public:
string name;
int NO;
Employee();
Employee(string,int);
friend istream& operator>>(istream &is,Employee &a);
friend ostream& operator<<(ostream &os,Employee &a);
};
Employee::Employee(string s,int i)
{
name=s;
NO=i;
}
Employee::Employee()
{
name="";
NO=0;
}
istream& operator>>(istream &is,Employee &a)
{
is>>a.name;
is>>a.NO;
return is;
}
ostream& operator<<(ostream &os,Employee &a)
{
os<<a.name;
os<<a.NO;
return os;
}
template <typename elemType>
class queue
{
elemType q;
struct node
{
elemType data;
struct node *link;
};
typedef struct node NODE;
NODE *head1,*tail1;
public:
queue();
void enqueue(elemType);
bool empty();
elemType dequeue();
class bad_op
{
public:
bad_op(int i) :type(i){}
int type;
};
};
template <typename elemType>
queue<elemType>::queue()
{
head1=NULL;
tail1=NULL;
}
template <typename elemType>
void queue<elemType>::enqueue(elemType a)
{
NODE *p;
p=new NODE;
p->data=a;
p->link=NULL;
if(head1==NULL)
head1=p;
else
tail1->link=p;
tail1=p;
}
template <typename elemType>
bool queue<elemType>::empty()
{
if(head1==NULL)
return true;
else
return false;
}
template <typename elemType>
elemType queue<elemType>::dequeue()
{
elemType output;
NODE *p;
output=head1->data;
p=head1;
head1=head1->link;
free(p);
return output;
}
测试程序test.cpp:
//**************************************************************
// test template queue -- EX12
//**************************************************************
#include <iostream>
using std::cout;
using std::cin;
using std::cerr;
using std::endl;
#include "queue.h"
int main()
{
while(true)
{
cin.clear(std::ios::goodbit); // make input stream noraml
cout << endl<< "Choice: int , char , employee, Quit (I/C/E/Q) : ";
char c;
cin >> c;
if (c=='Q'||c=='q') break;
if (c=='I'||c=='i') // test integer queue
try
{
queue<int> iq;
cout << "Enqueue: ";
for (int i=10000; i<=10005; i++) // enqueue 5 integers
{ iq.enqueue(i); cout << i << " "; }
cout << endl;
cout << "Dequeue: ";
while (!iq.empty()) // dequeue 5 integers
cout << iq.dequeue() << " ";
cout << endl;
cout << "enter integer to enqueue: ";
int c;
while (cin >> c) // enter and enqueue arbitrary integers
iq.enqueue(c);
cout << endl;
cout << "Dequeue: "; // dequeue arbitrary integers
while (!iq.empty())
cout << iq.dequeue() << " ";
cout << endl;
}
catch(queue<int>::bad_op bi)
{ cerr<< bi.type <<", exit " << endl; }
else if (c=='C'||c=='c') // test char queue
try
{
queue<char> cq;
cout << "Enqueue: ";
for (char i='A';i<='E';i++)
{ cq.enqueue(i); cout << i << " "; }
cout << endl;
cout << "Dequeue: ";
while (!cq.empty())
cout << cq.dequeue() << " ";
cout << endl;
cout << "enter character to enqueue: ";
char c;
while (cin >> c)
cq.enqueue(c);
cout << endl;
cout << "Dequeue: ";
while (!cq.empty())
cout << cq.dequeue() << " ";
cout << endl;
}
catch(queue<char>::bad_op bi)
{ cerr<< bi.type <<", exit " << endl; }
else if (c=='E'||c=='e') // test Employee queue
try
{
queue<Employee> eq;
cout << "Enqueue: ";
Employee a("john",1001);
Employee b("bjarne stroustrup",2001);
eq.enqueue(a); cout << a << " ";
eq.enqueue(b); cout << b << " ";
cout << endl;
cout << "Dequeue: ";
while (!eq.empty())
cout << eq.dequeue() << " ";
cout << endl;
cout << "enter employee to enqueue (name and department): ";
Employee c;
while (cin >> c)
eq.enqueue(c);
cout << endl;
cout << "Dequeue: ";
while (!eq.empty())
cout << eq.dequeue() << " ";
cout << endl;
}
catch(queue<Employee>::bad_op bi)
{ cerr<< bi.type <<", exit " << endl; }
else cout << "Invalid selection, Retry! " <<endl;
}
return 0;
}
用vc调试,error C2593: 'operator <<' is ambiguous,不知道为什么。
问题点数:40、回复次数:7Top
1 楼sisuo0204()回复于 2005-06-01 19:26:07 得分 0
为什么不用.net编译以下那?Top
2 楼linxco()回复于 2005-06-01 19:27:43 得分 0
不会Top
3 楼whyglinux(山青水秀)回复于 2005-06-01 19:34:06 得分 30
VC6的老问题了。在class Employee的定义前面加上如下声明语句试试:
class Employee;
istream& operator>>(istream &is,Employee &a);
ostream& operator<<(ostream &os,Employee &a);
另外,做好把上述函数里面的参数Employee &a改为const Employee &a。Top
4 楼linxco()回复于 2005-06-01 20:15:07 得分 0
whyglinux(山青水秀),谢谢你,成功了,不过还是想问问为什么会这样.Top
5 楼mostideal(三甲)回复于 2005-06-02 00:27:21 得分 0
学习。。。Top
6 楼zdy_8212(zdy_8212)回复于 2005-06-02 03:09:33 得分 10
二义性。主要是本对象一个重载操作与现有的操作相异同。所以Top
7 楼whyglinux(山青水秀)回复于 2005-06-02 09:55:46 得分 0
因为C++标准规定在类中对友元函数进行友元声明的时候,必须首先要对函数进行声明,否则程序是病态的。在这一点上,VC6的行为忠实地体现了标准的这一规定。
然而较新版本的C++编译器即使没有函数声明也是可以的。对于用户的使用上来说是显得方便了,但是显然不符合标准的规定。我对此比较困惑。Top




