48837
フレンドクラスでなぜ前方宣言をしてるのに認識できない型ですとコンパイルエラー出るのか教えてほしいです。ちなみにコメント部の部分にclass
fri{}コードを移動させるとコンパイル成功します。

```

    class base;
    class fri {
    public:
        fri() { }
    
        void f(base& x) { cout << x.t; }
    };
    
    class fri;
    class base {
        friend class fri;
    
    private:
        int t;
    
    protected:
        enum tmp { e_a , e_b, e_c };
    
    public:
        //void fri::f();
    
        base(int x) { t = x; }
        ~base(){ }
    
        void f()
        {
            int x = e_a;
            cout <<"x:"<< x;
        }
    
    };
    
    //////////ここに書く
    int main() {
        base b(100);
        fri x;
        x.f(b);
    
        _getch();
        return 0;
    }
    
```
CC BY-SA 4.0
2018-09-29T05:07:16.020
48815
2018-09-30T23:47:14.630
2018-09-30T23:47:14.630
question
c++
c++,フレンドクラスの使おうとすると認識できない型です、というエラー出る。原因
そのエラーの原因は`friend`とは関係がありません。

```

    class base;
    class fri {
    public:
        fri() { }
    
        void f(base& x) { cout << x.t; }
    };
    
```

メンバー関数`f`の中で`base`クラスを使っていますが、この段階では、`base`という名前のクラスがあると宣言しているだけで、具体的に、`base`にどんなメンバーがあるかは定義されていません。定義されていないのにメンバー変数`t`にアクセスしようとしているので、エラーになっています。

コメント部分でに`fri`の定義を移動するとエラーがなくなるのは、コメントのところでは既に`base`が定義されているからです。

別の解決方法として、`fri::f()`の中身をコメント部分に持ってくるという方法があります。つまり、`class fri`の定義部分を

```

    class base;
    class fri {
    public:
        fri() { }
    
        void f(base& x);
    };
    
```

とし、メンバー関数の本体部分のコードをコメント部分に置きます。

```

    void fri::f(base& x)
    {
        cout << x.t;
    }
    
```

いずれにせよ、`t`をアクセスするのは、`base`の定義が終わった後でなければなりません。

* * *

`friend`は、アクセス権を持たない外部のクラスや関数に、アクセスを許可するものです。アクセスを許可されても、どんなメンバーがあるか知らなければ、そもそもアクセスできません。
CC BY-SA 4.0
2018-09-30T02:59:28.980
48837
2018-09-30T04:12:01.417
2018-09-30T04:12:01.417
3605
3605
48815
answer