VC6.0でフレンド演算子関数を使用できない。

[戻る]
しんじ 2001/10/11(木) 13:13:01
はじめまして、しんじといいます。

最近、C++の勉強をはじめたのですが
VC6.0でフレンド演算子関数を利用すると内部コンパイルエラーと出てしまいます。
しかし、VC5.0・C++Builderでコンパイルするとエラーは出ないそうです。
VC6.0でフレンド演算子関数を含むプログラムのエラーなくす方法がわかる人は是非教えてください。

sugar 2001/10/11(木) 13:30:53
一般に、frend指定はVC6.0でも可能です。
コンパイルエラーが出るなら、どこか使い方がおかしいのでしょう。

としか言い様がないです。
具体的に、どういう使い方をしたらエラーが出たのか、
どんなエラーが出たのか
等を示して頂かないと、何とも答え様がありません。

しんじ 2001/10/11(木) 16:46:16
すみません説明不足でした。
VC6.0でfriend関数を利用する事はできるのですが、friend関数を用いて演算子のオーバーロードができません。

コンパイルすると次のようなエラーがでます。

--------------------構成: Cpp1 - Win32 Debug--------------------
コンパイル中...
Cpp1.cpp
C:\My Documents\Prog\C++\chap9\Cpp1.cpp(18) : fatal error C1001: 内部コンパイラ エラー
        (コンパイラ ファイル 'msc1.cpp', 行番号 1786)
         Visual C++ のサポート情報 コマンドを選択してください
            ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください
cl.exe の実行エラー

Cpp1.obj - エラー 1、警告 0


ソースプログラムは次のとおりです
#include <iostream>
using namespace std;

class coord
{
    int x,y;
public:
    coord(int i=0,int j=0)
    {
        x = i;
        y = j;
    }
    void get_xy(int &i,int &j)
    {
        i = x;
        j = y;
    }
    friend coord operator+(coord ob1,coord ob2);
};

coord operator+(coord ob1,coord ob2)
{
    coord temp;

    temp.x = ob1.x + ob2.x;
    temp.y = ob1.y + ob2.y;

    return temp;
}

int main()
{
    int x,y;
    coord o1(10,10),o2(5,3),o3;

    o3 = o1 + o2;
    o3.get(x,y);
    cout << "(o1+o2) X: " << x << ", Y: " << y << endl;

    return 0;
}

このプログラムがどうして内部コンパイラエラーになるか教えてください。

sugar 2001/10/12(金) 09:21:13
とりあえず、私の環境では問題なく動作します。
文法上の問題ではないと思われますが...

Console Applicationの空プロジェクトを作成し、
新規に追加したcppファイルに、掲示されたコードをそのままコピーしただけです。
あ、main()関数の「o3.get(x,y);」は「o3.get_xy(x,y);」とさせていただきましたが。

エラー番号が'C1001'となっています。
これについてちょっと調べてみると、「式と最適化オプションの相互作用が原因」とありました。
続けて、
「つまり最適化によって、コンパイラに処理方法がわからないようなツリーが生成されます。
 このような問題は多くの場合、エラー メッセージで示された行を含む関数のコンパイル時に
 行の一部あるいはすべての最適化オプションを解除すれば解決できます。」
とあります。
コンパイルオプションについては私はわかりませんが、
コンパイルが通る環境とそうでない環境で指定しているオプションを比較してみてはどうでしょう。

しんじ 2001/10/13(土) 22:59:39
[[解決]]
sugarさん、わざわざありがとうございます。
こちらでも調べて見ました。
端的に言うと原因はVC6.0のバグです。
このバグをとる為にはVisual Strudio Service PackのVer.3を入れればいいらしいですよ。
今はVer.5ですが、Ver1・2・3・4を含んでいるそうです。
Ver.5は133MByteもあるので大学のLAN回線でDLしたいと思います。

sugarさん色んな情報の提供ありがとうございました。
無事解決することができそうです。

このページに上のことがちょっと詳しく書いてあります。
http://www.microsoft.com/JAPAN/support/kb/articles/J047/7/07.htm

古いスレッドには追加発言できません。