2017-12-22 10 views
4

::foo()という関数では、構文が何であるか分かりません。 foo::count_all()の場合、count_allはクラスまたは名前空間fooの関数であることがわかりました。C++で構文:: function_nameの意味は何ですか?

::foo()の場合は、::とは何ですか?

+2

[例えば::と理由先頭に追加名前空間、::のstd ::ベクトル](https://stackoverflow.com/questions/4925394/why-prepend-namespace-with-for-exampleの可能性のある重複-stdvector) –

答えて

4

::オペレータはnamespaceまたはclassを呼び出しています。あなたのケースでは、名前付き名前空間にないすべてのグローバル名前空間を呼び出しています。

以下の例は、名前空間が重要な理由を示しています。 foo()に電話すると、2 fooがあるため、通話を解決できません。あなたは::foo()でグローバルなものを解決する必要があります。

namespace Hidden { 
    int foo(); 
} 

int foo(); 

using namespace Hidden; // This makes calls to just foo ambiguous. 

int main() { 
    ::foo(); // Call to the global foo 
    hidden::foo(); // Call to the foo in namespace hidden 
} 
+0

ニース。これは良い例です。私はちょっとあなたがそれを必要とする場合にそれをより明確にするために少し追加しました。 –

+0

@FantasticMrFox私の答えにあなたの入力をありがとう、本当に感謝します。 –

+0

本当にありがとうございます。 –

2

::これは、グローバル名前空間を示す前に何も表示されません。例えば:

int foo(); // A global function declaration 

int main() { 
    ::foo(); // Calling foo from the global namespace. 
    ... 
1

グローバルスコープの関数foo()に対する関数呼び出しで、宣言ではありません。関数名の前の::は、グローバル関数foo()を明示的に呼び出すことを意味しますが、いくつかの狭い範囲からは別のバージョンのfoo()を呼び出さないことを意味します。

など。

void foo() 
{ 
    printf("global foo\n"); 
} 

namespace bar 
{ 
    void foo() 
    { 
    printf("bar::foo\n"); 
    } 

    void test() 
    { 
    foo(); 
    ::foo(); 
    } 
} 

::テストをバーの呼び出し()出力します:

bar::foo 
global foo 
-1

を指定することで::あなたがグローバル名前空間を見てシステムを語りました。この記事の下

https://stackoverflow.com/a/6790112/249492

にも参照してください。私たちは、「巣」の名前空間の中にいる、@CharlesBaileyによって一例です。 "x"にアクセスすると、グローバル名前空間を使用するかどうかに応じて、上位の名前空間に変更できます。

namespace layer { 
    namespace module { 
     int x; 
    } 
} 

namespace nest { 
    namespace layer { 
     namespace module { 
      int x; 
     } 
    } 
    using namespace /*::*/layer::module; 
} 
+0

リンクを共有するだけではありません。回答に関連する情報を追加します。 –

+0

@FantasticMrFox、フィードバックいただきありがとうございます。その考えは重複した反応を減らすことでした。私は例を挙げて答えを更新しました。 – Damian

関連する問題