現在オフラインです。再接続するためにインターネットの接続を待っています

[VC60] SP3: friend 演算子の前で using namespace std が未解決

この記事は、以前は次の ID で公開されていました: JP192539
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。
現象
"using namespace std" ディレクティブをフレンド演算子の宣言の前に置くと、次の 2つのエラーのどちらかが発生します。

ケース 1

error C2248: [member variable name] : cannot access private member declared
in class [class name] [file name] (line number) : see declaration of
[member variable]

ケース 2

[file name](line number) : 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.
原因
std namespace が導入されると、コンパイラのフロント エンド処理でフレンド演算子の解決に失敗することが原因です。
状況
資料の冒頭に記載している製品の障害として確認しております。この障害は Visual Studio(R) 6.0 Service Pack 3 にて修正されました。Visual Studio 6.0 Service Pack の詳細情報は、弊社 Web サイトをご覧ください。
解決方法
Visual Studio(R) 6.0 Service Pack 3 をインストールすることで解決できます。以下は Service Pack 3 を適用しない場合の解決方法です。

この問題を回避するためには、次のいずれかの操作を行ってください。
  • "using namespace std" ディレクティブをフレンド演算子の宣言の後に移動する。
  • "using namespace std" ディレクティブを使用しない。
  • 演算子またはクラス (あるいはその両方) を前方で宣言する。
詳細

Test1.cpp は、ケース 1 に相当する C2248 エラーを再現します

      // test1.cpp      // 必要なコンパイラ オプション: 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 &);        // この方法以外に演算子をクラスの宣言の中で定義する方法        // もあります。その場合は、クラスとフレンド関数を前方で        // 宣言する必要がありません。      private:         int value;      };      ostream& operator <<(ostream& out, const CMyClass& m)      {         int i = m.value;  // C2248 エラー         return out;      }      void main()      { }

Test2.cpp は、ケース 2 に相当する C1001 エラーを再現します

      // test2.cpp      // 必要なコンパイラ オプション: 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 エラー      };      void main()      { }
関連情報
文書番号 : 194295
タイトル : [VS60] Service Pack がインストール済みか確認するには

文書番号 : 194022
タイトル : [VS60] SP3: よく寄せられる質問 (FAQ)
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 192539 (最終更新日 1999-08-19) をもとに作成したものです。

プロパティ

文書番号:192539 - 最終更新日: 08/19/1999 16:55:00 - リビジョン: 1.0

  • Microsoft Visual C++ 6.0 Service Pack 5
  • kbdss kbfix kbfix kbvs600sp3 vc60 vs60 KB192539
フィードバック