使用友元,编译出错fatal error C1001: INTERNAL COMPILER ERROR (compiler file ‘msc1.cpp‘, line 1786) 的解决

文章讲述了作者在C++中遇到友元函数重载运算符时的编译错误,并提供了两种解决方法:修改头文件中的#include语句和在类声明前做前导声明。同时解释了iostream.h与iostream的区别以及可能导致的编译器错误原因。
摘要由CSDN通过智能技术生成

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://lihuan-dianxian.blogbus.com/logs/42102230.html

 

 

同学拿了个很简单的小程序过来问我,重载了个运算符,如果作为成员函数,一点问题没有;如果作为友元函数重载,就会出现下面的编译出错提示:

 

-------------------Configuration: money - Win32 Debug--------------------

Compiling...

money.cpp

F:\c++workspaces\money\money.cpp(12) : fatal error C1001: INTERNAL COMPILER ERROR

        (compiler file 'msc1.cpp', line 1786) 

         Please choose the Technical Support command on the Visual C++ 

         Help menu, or open the Technical Support help file for more information

Error executing cl.exe.

 

money.obj - 1 error(s), 0 warning(s)

 

最怕这种叽歪的错误,其实程序的编写是没问题的,也会这样。。于是,常规思路,上网搜搜呗。

 

寻寻觅觅的过程就不罗嗦了,解决的办法如下:

 

方法一:

 

头文件的 #include<iostream> 改成 #include<iostream.h>

 

然后删除语句 using namespace std;

 

方法二:【0】

不改动头文件那,在类的声明前面加上下面两条语句,作为前导声明

class money;

money operator + (const money& account1,const money& account2)

 

就都可以编译通过了~

 

究其原因,我试着说说吧。先说包含头文件的时候,带不带.h的扩展名的意思是差很多的。若用<iostream.h>的话,表示告诉编译器,使用VisualC++6.0的基础开发环境自己的输入输出流类库头文件iostream.h。而<iostream>是指使用ISO C++标准的输入输出流类库头文件iostream。并非省略扩展名,包含的本身就是两个不同的文件。

 

如果你觉得没理解,还有下面的这种解释方式:

 

当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。【1】

 

还没明白就算了,知道这么回事先。其实我也不是特别透。

 

此外,关于fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) 的错误,还有一说:

 

因为别的非友元的问题引起的这个错误,具体原因未知,如果遇到,可以用下面的解决方法44看:

 

一、在Project/Setting/ c/c++中的Project option,从中删除 /Zg 或 /Gz 或者一些个别的比如/oa之类的,然后重写下出错的那行,再编译试试。一次删除一个,如果仍出错那么就说明不是原因,可添加回去再删除别的试试。【2】

 

二、某大人介绍了自己用到的情况:“我在调用一个自己的函数时出现这个错误,我通过多方努力找到了原因:我的这个函数有一个结构体参数,并且该结构体比较庞大,之前我是将整个结构体都传入而导致编译出错,最后我改成传入该结构体的地址(传引用),这下编译就对了”。【3】

 

我就简单的贴在这里了。

 

为了保持严谨的科学态度,下面标明参考文献:

 

【0】http://topic.csdn.net/t/20041203/13/3612519.html

 

【1】http://www.kuqin.com/language/20080107/3532.html

 

【2】http://book.77169.org/ask36/how167856.htm,http://www.codeguru.com/forum/showthread.php?t=314848

 

【3】http://www.china-askpro.com/msg41/qa74.shtml

 

最后,附上那段程序好了

 

#include<iostream>

#include<cstdlib>

#include<cctype>

using namespace std;

 

int char_to_int(char c);

 

class money;

money operator + (const money& account1,const money& account2);

 

class money

{

public:

 friend money operator + (const money& account1,const money& account2);

 

    bool operator == ( const money& account1);

 money percent(int percent_figure) const;

 money(long dollars,int cents);

 money(long dollars);

 money();

 double get_value() const;

 void input(istream& ins);

 void output(ostream& outs) const;

private:

 long all_cents;

};

 

int main()

{

 money luli(1,3),guo(5,8),total;

 total=luli+guo;

 cout<<"luli's money is";

 luli.output(cout);

 cout<<endl;

 cout<<"guo's money is";

 guo.output(cout);

 cout<<endl;

 cout<<"luli's money+guo's money=";

 total.output(cout);

 cout<<endl;

 if(luli==guo)

  cout<<"your money are equal!\n";

 else

  cout<<"one of you are richer!\n";

 money lugang;

 lugang.input(cin);

 lugang.output(cout);

 lugang.percent(10);

 lugang.output(cout);

 return 0;

}

 

money operator + (const money& account1,const money& account2)

{

 money temp;

 temp.all_cents=account2.all_cents+account1.all_cents;

 return temp;

}

 

bool money:: operator == (const money& account1)

{

 return(all_cents==account1.all_cents);

}

 

money::money(long dollars,int cents):all_cents(dollars*100+cents)

{

 if(dollars<0||cents<0)

 { 

  cout<<"illeagal number for money!\n";

  exit(1);

 }

}

 

money::money(long dollars):all_cents(dollars*100)

{

 if(dollars<0)

 { 

  cout<<"illeagal number for money!\n";

  exit(1);

 }

}

 

money::money():all_cents(0)

{

}

 

double money:: get_value() const

{

 return(all_cents);

}

 

void money::input(istream& ins)

{

 long dollars;

 char date1,date2;

 char one_char,decimal_point;

 bool negative;

 cout<<"please enter one char('-'or'$')\n";

 ins>>one_char;

 if(one_char=='-')

 {

  negative=true;

  cout<<"please enter one char('$')\n";

  ins>>one_char;

 }

 cout<<"please enter dollars\n";

 ins>>dollars;

 cout<<"enter decimal_point\n";

 ins>>decimal_point;

 cout<<"please enter your cents(date1,date2 in char)\n";

 ins>>date1>>date2;

 if(one_char!='$'||dollars<0||decimal_point!='.'||!isdigit(date1)||!isdigit(date2))

 {

  cout<<"error illeagal form for money!\n";

  exit(1);

 }

 all_cents=dollars*100+char_to_int(date1)*10+char_to_int(date2);

 if(negative)

  all_cents=-all_cents;

}

 

void money::output(ostream& outs) const

{

 long positive_cents,dollars,cents;

 if(all_cents<0)

 {

  outs<<"-";

  positive_cents=labs(all_cents);

 }

 positive_cents=all_cents;

 outs.setf(ios::fixed);

 outs.setf(ios::showpoint);

 outs.precision(2);

 dollars=positive_cents/100;

 cents=positive_cents%100;

 outs<<"$"<<dollars;

 outs<<".";

 if(cents<10)

 {

  outs<<"0";

 }

 outs<<cents<<endl;

}

 

int char_to_int(char c)

{

 return(int(c)-int('0'));

}

 

money money:: percent(int percent_figure) const

{

 return all_cents*percent_figure/100;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值