FIX: 您收到错误消息时在"使用的命名空间 std"指令可以位于友元运算符之前

文章翻译 文章翻译
文章编号: 192539 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当在"使用命名空间 std"指令可以位于友元运算符声明之前,您可能会收到下面的两个错误之一:

情况 1
错误 C2248: [成员变量名]: 不能访问私有成员声明中类 [类别名称] [文件名] (行号): [成员变量] 的声明,请参阅
情况 2
[文件名](行号): 致命错误 C1001: 内部编译器错误

(编译器文件 'msc1.cpp 行 1786年)
请选择 Visual c + + 帮助菜单上的技术支持命令,或打开技术支持帮助文件的详细信息。

执行 cl.exe 时出错。

原因

友元运算符解析失败前端的编译器中时引入 std 命名空间。

解决方案

现在提供 Microsoft,受支持的修复程序,但它只用于解决本文所述的问题。仅将它应用于出现这一特定问题的系统。此修补程序可能还会接受进一步的测试。因此,如果此问题没有对您造成严重的影响,我们建议您在 Visual Studio 6.0 包含此修补程序用于等待下一个 Service Pack 3。

要立即解决此问题,请与 Microsoft 产品支持服务以获取此修复程序。有关 Microsoft 产品支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的 Microsoft 网站:
http://support.microsoft.com/contactus/?ws=support
注意 在特殊的情况中如果 Microsoft 支持专业人员确定某个特定更新才能解决您的问题,可能会被取消通常会导致支持电话的费用。将正常收取支持费用将应用于其他支持问题和不需要进行专门更新的问题。此修复程序的英文版应具有以下文件属性或更高版本:
   Date      Time      Size        File Name  Version#      Platform
   -----------------------------------------------------------------

   9/15/98   08:26p    1,183,795   C1xx.dll   12.00.8257.0  (x86)
				

替代方法

请执行下列操作以解决此问题之一:
  • 移动在"使用的命名空间 std"指令到朋友运算符声明的后面。
  • 避免使用在"使用的命名空间 std"指令。
  • 向前声明运算符和/或类。

状态

Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的错误。在 Visual Studio 6.0 Service Pack 3 中,此缺陷已得到纠正。

有关 Visual Studio 的服务包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
194022visual Studio 6.0 服务包是什么,其中,为什么
194295如何判断安装了 Visual Studio 服务包

更多信息

Test1.cpp 重新产生 C2248 错误在情况 1 中

   // test1.cpp
   // Compiler options needed: cl /c /GX
   #include <iostream>

   using namespace std;

   #ifdef WORKAROUND
   class CMyClass;
   ostream& operator <<(ostream &, const CMyClass &);
   #endif // WORKAROUND

   class CMyClass
   {
   public:

     friend ostream& operator <<(ostream &, const CMyClass &);
     // An alternative workaround is to define the operator in the
     // class declaration. In this case it is not necessary to forward
     // declare the class and friend function.

   private:

      int value;
   };

   ostream& operator <<(ostream& out, const CMyClass& m)
   {

      int i = m.value;  // C2248 Error
      return out;
   }

   void main()
   { }
				

Test2.cpp 重新产生 C1001 错误情况 2 中

   // test2.cpp
   // Compiler options needed: cl /c /GX
   #include <iostream>

   using namespace std;

   #ifdef WORKAROUND
   int operator+(int, const class &);
   #endif // WORKAROUND

   class CMyClass
   {
   public:

     friend int operator+(int, const CMyClass &);  // C1001 Error.

   };

   void main()
   { }
				

属性

文章编号: 192539 - 最后修改: 2005年10月7日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字:?
kbmt kbhotfixserver kbqfe kbqfe kbbug kberrmsg kbfix kblangcpp kbvs600sp3fix KB192539 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 192539
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com