2008-09-16 6 views

答えて

54

グローバルスコープを意味します。競合する関数または変数が同じスコープ内にあり、グローバル変数を使用する必要がある場合は、この演算子を使用する必要があります。あなたは、クラスのメンバ関数内からグローバルバー()関数を呼び出す必要がある場合は、あなたが使用する必要があります

void bar(); // this is a global function 

class foo { 
    void some_func() { ::bar(); } // this function is calling the global bar() and not the class version 
    void bar();      // this is a class member 
}; 

::バー()関数のグローバルバージョンを取得する:あなたは、のようなものがあるかもしれません。

+2

なぜコンパイルされませんか? –

+1

[コンパイルされたようです] –

+0

匿名の名前空間で定義するものは、単項スコープ演算子を使用して呼び出すこともできます。 – DrumM

1

すでにあなたのローカルスコープ内の関数fooという名前を()持っていますが、グローバルスコープで1にアクセスする必要がある場合には、グローバルスコープ

+4

-1:非常に怠惰です! –

1

私のC++は錆びますが、関数foo()やグローバルスコープfoo()はローカルスコープで宣言されている関数をローカルスコープで宣言していると思います。 :: foo()はグローバルなものを参照します。

4

また、名前解決は過負荷解決の前に行われることに注意してください。したがって、現在のスコープに同じ名前のものがある場合、他の名前を探すのを止め、それらを使用しようとします。

void bar() {}; 
class foo { 
    void bar(int) {}; 
    void foobar() { bar(); } // won't compile needs ::bar() 
    void foobar(int i) { bar(i); } // ok 
} 
4

scope resolution operator::)で始まる名前は、グローバル名前空間に検索されます。単項スコープ演算子で始まる名前::(5.1)

されています。私たちは、draft C++ standardセクション3.4.3修飾名検索(強調鉱山)と言う段落を見て、これを見ることができますグローバルスコープを使用している翻訳単位で検索しました。名前は、グローバル名前空間のスコープで宣言されるか、またはusingディレクティブ(3.4.3.2)のために宣言がグローバルスコープで可視である名前とする。 :: を使用すると、その識別子が隠されていてもグローバル名を参照することができます(3.3.10)。

int count = 0; 

int main(void) { 
    int count = 0; 
    ::count = 1; // set global count to 1 
    count = 2; // set local count to 2 
    return 0; 
} 

文言があるN1804に戻って非常に似ています。次のように、これは私たちがグローバル名前空間that would otherwise be hiddenから名前を使用することができ、標準状態として

は、リンクされたドキュメントからの例です。入手可能な最も初期のドラフト規格。

関連する問題