2011-12-16 3 views
3

::fully::qualified::namespace::name 폼을 사용하지 않고 C++에서 네임 스페이스를 되돌릴 수있는 방법이 있습니까?백 트랙 네임 스페이스

을 감안할 때 :

namespace f { 
    void p() { } 
    namespace g { 
     void p() { 
      [..]::p(); 
     } 
    } 
} 

가 (즉 ::f::p())을 완벽하게 자격을 갖춘 차별화는 [..]의 올바른 양식이 있습니까? 목표는 이 아니며은 p()를 사용합니다. 무한 재귀가 여기에 목표가 아니며 공간을 절약하기 위해 FQ를 사용하지 않기 때문에 p()를 사용하십시오.

+1

'F : p'가 _fully_을 자격을하지 않는 즉각적인 범위 수준 (블록 또는 네임 스페이스를, exlcude하는 조회를 강제로 명시 적 방법은 없습니다. 예 ':: f :: p()'가 무한 재귀를 일으키는 반면,':: f (p) {} :: {namespace f {void p() {f :: p() : p'는 가장 가까운'f'를 찾은 다음 발견 한'f'에서'p'를 찾습니다. 당신의 경우'f :: p'는 필요한 최소 자격입니다. : f :: p'이 경우에는 얻지 못할 것이 많지만. –

+2

¤ 아뇨, 죄송합니다.하지만 이모는 좋은 생각이고, 당신은 이것을 제안하는 데 혼자만의 것이 아닙니다. 주변 네임 스페이스에 대한 네임 스페이스 별칭을 정의하고 [여기에 표시] (http://codepad.org/V80j9kbb)와 같이 원하는 사용법 표기법을 얻을 수 있습니다. 건배 & hth., –

+0

@CharlesBailey 죄송합니다, 나는':: f :: p()'를 의미했습니다. 내 오타를 찾아 주셔서 감사합니다. – moshbear

답변

3

이름 조회는 내부 범위에서 바깥쪽으로 작동하므로 매번 위에서 아래로 이동할 필요가 없습니다. 처음으로 ::을 생략하면 찾으려는 이름을 찾을 때까지 역 추적 조회가 이루어 지므로 f::pf을 찾은 후 p을 찾아 f 안에 넣습니다. 귀하의 경우에는 f이 글로벌 네임 스페이스에 있으므로 큰 입력 차이는 없습니다. 전체 ::f::p()은 필요하지 않습니다.

::f::g::f::p() 호출에 대한 절약이 더 명확한이 예제를 고려하십시오.

namespace f { 
    void p(); 
    namespace g { 
     void p(); 
     namespace f { 
      void p(); 
      namespace h { 
       void p() 
       { 
        f::p(); // same as ::f::g::f::p() 
        ::f::p(); // fully qualified 
        g::p(); // same as ::f::g::p(); 
        p();  // recurse! 
       } 
      } 
     } 
    } 
} 

은 결코 ..::p() 또는 ^::p() 또는 뭔가.