2017-12-22 1 views
4

::foo()이라는 함수에서 구문이 무엇인지 이해하지 못합니다. foo::count_all() 인 경우 count_all은 클래스 또는 네임 스페이스 foo의 함수임을 알고 있습니다.C++의 구문 :: function_name은 무엇을 의미합니까?

::foo()의 경우 ::은 무엇입니까?

+2

가능한 복제 [왜 ::와 앞에 추가 공간, 예 : 표준 : : 벡터 (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

관련 문제