フレンドクラスでなぜ前方宣言をしてるのに認識できない型ですとコンパイルエラー出るのか教えてほしいです。ちなみにコメント部の部分に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;
}