c++のnamespaceについて


下記のコードで次のようなエラーが出ます。

Aの名前空間でBの変数を使用しているのですが、認識されません。  
どのようにすれば解決するでしょうか？  
解決策が分かる方はよろしくお願いいたします。

**エラーメッセージ**

[code]

    namespace.cpp: In function ‘void A::Func()’:
    namespace.cpp: error: ‘B’ has not been declared
    std::cout << B::y << std::endl;
    
[/code]

**ソースコード**

[code]

    #include<iostream>
    namespace A{
     int x;
     void Func(){
      std::cout << B::y << std::endl;
     }
    };
    namespace B{
     int y;
     void Func(){
      std::cout << A::x << std::endl;
     }
    };
    int main(){
     A::x = 2;
     B::y = 5;
     A::Func();
     B::Func();
    }
    
[/code]




C++のコンパイラは、上からコードを解析していくので、関数や変数の名前は、使う前に宣言しなければなりません。なので、先に宣言しましょう。

[code]

    namespace B{
     int y; // 先に定義しておく
    }
    
    namespace A{
     int x;
     void Func(){
      std::cout << B::y << std::endl;
     }
    };
    namespace B{
    // int y; <- ここのは不要
     void Func(){
      std::cout << A::x << std::endl;
     }
    };
    
[/code]

こんな方法もあります。

[code]

    namespace B{
     extern int y; // 名前だけ宣言
    }
    
    namespace A{
     int x;
     void Func(){
      std::cout << B::y << std::endl;
     }
    };
    namespace B{
     int y; // 実体は、ここで定義
     void Func(){
      std::cout << A::x << std::endl;
     }
    };
    
[/code]




C++のコンパイラは、上からコードを解析していくので、関数や変数の名前は、使う前に宣言しなければなりません。なので、先に宣言しましょう。

[code]

    namespace B{
     int y; // 先に定義しておく
    }
    
    namespace A{
     int x;
     void Func(){
      std::cout << B::y << std::endl;
     }
    };
    namespace B{
    // int y; <- ここのは不要
     void Func(){
      std::cout << A::x << std::endl;
     }
    };
    
[/code]

こんな方法もあります。

[code]

    namespace B{
     extern int y; // 名前だけ宣言
    }
    
    namespace A{
     int x;
     void Func(){
      std::cout << B::y << std::endl;
     }
    };
    namespace B{
     int y; // 実体は、ここで定義
     void Func(){
      std::cout << A::x << std::endl;
     }
    };
    
[/code]

