版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
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
改成 #include 然后删除语句 using namespace std;
方法二:【0】
不改动头文件那,在类的声明前面加上下面两条语句,作为前导声明
class money;
money operator + (const money& account1,const money& account2)就都可以编译通过了~
究其原因,我试着说说吧。先说包含头文件的时候,带不带.h的扩展名的意思是差很多的。若用
如果你觉得没理解,还有下面的这种解释方式:
当使用
还没明白就算了,知道这么回事先。其实我也不是特别透。
此外,关于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
#include
#include
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<>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<<"$"<