| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1132 人关注过本帖
标题:[求助]为什么重载cout时,用命名空间包含头文件会报编译错误?
只看楼主 加入收藏
zhipi
Rank: 2
等 级:论坛游民
帖 子:4
专家分:20
注 册:2007-6-30
收藏
 问题点数:0 回复次数:0 
[求助]为什么重载cout时,用命名空间包含头文件会报编译错误?

最近开始做C++课程设计,我的题目是:编写一个字符串(String)类。
为了尽可能写得适用些,我决定重载 cout<< 和 cin>> 进行该类的输入输出。我查看了很多网站,都说了一种重载方式如下:

friend ostream& operator<<(ostream&,classname&);
friend istream& operator>>(istrema&,classname&);

程序具体如下:
class String
{
public:
String(){} //构造函数1
String(char *s); //构造函数2
~String(); //析构函数
String operator =(String s); //=号重载1
String operator =(char *s); //=号重载2
friend ostream& operator<<(ostream&,String &); //<<重载为友元
friend istream& operator>>(istream&,String &); //>>重载为友元
private:
char *str; //串首指针
int len;
//串长度
}
//-----------函数实现-------------
String::String(char *s)
{
int k=0;
char *p;
for(p=s;*p!='\0';p++) // 求长度
k++;
len=k;
str=new char[len+1];
for(int i=0;i<len;i++)
str[i]=s[i];
str[len]='\0';
}

// '='号重载(1),将一个String类的对象赋值给另一个String类的对象
String String::operator =(String s)
{
str=new char[s.len+1];
strcpy(str,s.str);
str[s.len]='\0';
len=s.len;
return *this; //返回this指针所指向的对象
}

// '='号重载(2),将一个String类的对象用字符串常量初始化
String String::operator =(char *s)
{
int k=0;
char *p;
for(p=s;*p!='\0';p++)
k++;
len=k;
str=new char[len+1];
for(int i=0;i<len;i++)
str[i]=s[i];
str[len]='\0';
return *this;
}

ostream& operator <<(ostream& os,String &s) //插入运算符'<<'的重载
{
os<<s.str;
return os; //返回输出流对象
}

istream& operator >>(istream& is,String &s) //提取运算符'>>'的重载
{
int count;
getchar();
count = stdin->_cnt; //取得缓冲区的字符数量
s.str = new char[count+1]; //申请空间
memcpy(s.str, stdin->_base, count?count:1); //将字符串复制到新申请的空间中
*(s.str+count) = '\0'; //添加字符串结束标志
s.len=count;
return is; //返回输入流对象
}

void main()
{
String str;
cout<<"Input a string:"<<endl;
cin>>str;
cout<<str<<endl;
}

上面的程序
如果使用#include <iostream.h>包含头文件,则该方法可行;
但是如果使用命名空间(
即:#include <iostream>
using namespace std;
)
则编译会报如下两类错误:
(1).
error C2593: 'operator >>' is ambiguous
error C2593: 'operator <<' is ambiguous
(2).
上述两个友元函数中不能访问私有成员。

于是,我又查阅了大量网站,发现也有人碰到同样的问题,如:

http://community.csdn.net/Expert/topic/5617/5617014.xml?temp=.5877649
http://topic.csdn.net/t/20020822/09/960282.html

但众说纷纭,无所适从,没有最终确切的答案。还望忘各位指点!不甚感激!

上次可能说得不够具体,见很多朋友来看了,却没有答复,所以这次把程序帖出来,
希望能把问题说得更明白些。

[此贴子已经被作者于2007-7-1 11:33:37编辑过]

搜索更多相关主题的帖子: 编译 cout 会报 空间 文件 
2007-06-30 15:07
快速回复:[求助]为什么重载cout时,用命名空间包含头文件会报编译错误?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016958 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved