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

文書翻訳 文書翻訳
文書番号: 192539 - 対象製品
この記事は、以前は次の 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 サイトをご覧ください。
http://www.asia.microsoft.com/japan/developer/vstudio/techinfo/sp/vs6sp.htm

解決方法

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 - 最終更新日: 1999年8月19日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 6.0 Service Pack 5
キーワード:?
kbdss kbfix kbfix kbvs600sp3 vc60 vs60 KB192539
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

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