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

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

--------------------Configuration: b - Win32 Debug--------------------
Compiling...
b.cpp
E:\DEMO\b.cpp(16) : 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
执行 cl.exe 时出错.
b.obj - 1 error(s), 0 warning(s)

即使程序的编写是没问题的,也会这样。究其原因是编译器的问题,解决办法如下:


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

然后删除语句 using namespace std;


      若用<iostream.h>的话,表示告诉编译器,使用VC++6.0的基础开发环境自己的输入输出流类库头文iostream.h。而<iostream>是指使用ISO C++标准的输入输出流类库头文件iostream。并非省略扩展名,包含的本身就是两个不同的文件。

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

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

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

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

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

附一段我出过这种错的小代码:

# include <iostream>
using namespace std;
class Comple
{
private:
double real;
double imag;
public:
Comple (double a = 0,double b = 0)
{
real = a;
imag = b;
}
friend Comple operator +(Comple &c1,Comple &c2);
friend Comple operator -(Comple &c1,Comple &c2);
friend ostream & operator <<(ostream &output,Comple &c);
};


Comple operator +(Comple &c1,Comple &c2)
{
Comple c;
c.real = c1.real + c2.real;
c.imag = c1.imag + c2.imag;
return c;
}


Comple operator -(Comple &c1,Comple &c2)
{
Comple c;
c.real = c1.real - c2.real;
c.imag = c1.imag - c2.imag;
return c;
}


ostream & operator <<(ostream &output,Comple &c)
{
output<<c.real;
if(c.real>0)
{
  output<<"+";
}
output<<c.imag<<"i"<<endl;
return output;
}


int main()
{
Comple c1(3.2,4.5),c2(8.9,5.6),c3,c4;
cout<<"a="<<c1;
cout<<"b="<<c2;
c3 = c1 + c2;
cout<<"a+b="<<c3;
c4 = c1 - c2;
cout<<"a-b="<<c4;
return 0;
}

猜你喜欢

转载自blog.csdn.net/M17865923255/article/details/49496197