当前位置: 首页 > 编程技术 > 正文

解决fatal error C1001: INTERNAL COMPILER ERROR错误

今天打算复习下运算符重载,运算符的在C++中一个典型的的应用就是输入输出流,在C++中“<<“和“>>”本是逻辑右移和逻辑左移,但是C++这两个运算符进行了重载,也就有了C++方便与c的输入输出方式
举个例,
int a;char c;
c的输入输出方式分别是
scanf(“%d %c”,&a,&c);
printf(“%d % c”,a,c);

C++的输入输出方式
cin>>a>>c; //必须用到标准命名空间std:using namespace std;
cout<<a<<c;
相对于C++方便输入输出方式C的输入输出都必须指定数据的类型,尤其是输入scanf很容易漏掉取地址符”&”,导致致命错误
虽然C++输入输出方式很方便,但是在今天的编写类的过程中,却遇到了麻烦

今天编写的是一个对字符串的相关操作的运算符进行重载的class,类似于MFC中的CString类
由于惯性,在编写类的头文件的时候,习惯性的加上了C++的预处理命令

#include <iostream>
using namespace std;
在编写的类中因为有运算符的表达式的第一个参数不为类对象,所以将相应的函数声明为了友元函数(在函数的生命前面加上关键词friend即可),加上需要对”<<“运算符进行重载:friend ostream & operator << (ostream &,Cstring &);

也用到了friend关键词,但是,类的声明和定义完成后,编译源代码,VC++ 6.0提示:
fatal error C1001: INTERNAL COMPILER ERROR
这又是一个很让人摸不着头脑的错误提示:编译系统提示带有friend关键词的代码有问题,但是代码是不可能有错误的
将friend关键词去掉,问题消失了,但是有出现了其他的莫名的错误
上网查询相关的错误提示,有的帖子说是内存的原因,还有其他的原因,查询MSDN,上面虽然有解决方案,但是都没有解决问题,

经过反复的构建搜索关键词,终于在CSDN的一个网友的回复中找到了解决方案:

VC++ 6.0 在声明友元函数的头文件中不要加上利用命令空间,也就是省掉 using namespace std;

或者是使用VS来编译,可以是vs2005,vs2008 ,vs2010

如果是只有VC++ 6.0的话,运算符重载可以使用std::cout,std::cin来代替预处理是利用命名空间

重要说明:

在运算符重载的时候,尤其是对“<<”和“>>”进行重载是与其余的允许从重载的运算符不同 ,必须加上using namespace std;

或者是使用std::ostream和std:;istream。而且在类中声明也只能声明为友元成员函数


两者的重载的格式也有不同;

输入输出运算符重载格式:
声明 friend ostream & 类名 <<(ostream &,类名&) //这里的可以设定形参,也可以不设定形参,
定义: ostream & 类名 <<(ostream & output,类名 & 成员)
{
output<<成员名.变量 //将output当作cout使用
return output; //必须有返回值

}
普通运算符重载格式:

声明:类名 operator 运算符 (形参 ,必须有一个是类成员)
定义: 类名::operator 运算符 (形参)

{…..}



本文固定链接: http://kuaile.in/archives/365 | 蒲公英的博客

该日志由 蒲公英 于2012年02月10日发表在 编程技术 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 解决fatal error C1001: INTERNAL COMPILER ERROR错误 | 蒲公英的博客
关键字:

解决fatal error C1001: INTERNAL COMPILER ERROR错误:等您坐沙发呢!

发表评论


You must enable javascript to see captcha here!

快捷键:Ctrl+Enter