2012-03-08 27 views
1

私はヘッダファイルに次のように定義したとします名前空間の私には意味がありません

namespace MyNamespace 
{ 
    Class global_c; 
} 

それから私は、ソースファイルに次の操作を行います。

namespace MyNamespace 
{ 
    void MyClass::Function() 
    { 
     ::global_c.DoSomething(); 
    } 
} 

global_cは未定義と判明コンパイラによって、もし私がglobal_c.DoSomething()をしていれば;しかし、私は '名前空間MyNamespaceを使用して追加する場合、それはうまくコンパイルされます;ファイルの先頭にも正常に動作します。

global_cは 'MyClass'と同じ名前空間に存在するので、 '::'がその前に追加されただけで解決できないのはなぜですか?

答えて

10

変数に::を追加することによって、グローバル名前空間を使用するようにコンパイラに明示的に指示しているためです。 global_cはグローバル名前空間に存在しないため、エラーが発生します。

コンパイラは、あなたが言ったことをやっているだけです。 ::Global::と考えてください。

+0

もしそうなら、どのようにそれがまだそれを見つけることができますか?グローバル名前空間でMyNamespaceという名前空間ではなく、それを探しているので、それはまだ落ちないはずですか? – tweetypi

+0

@meds:どういう意味ですか? '::'を前置すると、確かに動作しません。それを残しておくと、現在のネームスペース( 'MyNamespace')が使用されます。 –

+0

S「::」を前に付けて、ソースファイル内で「名前空間MyNamespaceを使用」すると、コンパイラは変数を見つけることができます。これは、変数をグローバルで探すときに意味しますそれはグローバル名前空間だけでなく、 'using'ネームスペースもチェックしていますか? – tweetypi

関連する問題