2013-08-08 7 views
1

라이브러리의 정규화 된 이름이 필요한지 알고 싶습니다.라이브러리의 네임 스페이스 사용

namespace A { 
    namespace B { 
     namespace C { 
      class Foo { ... }; 
     } // namespace C 

     ::A::B::C::Foo foo; 
     // or 
     C::Foo foo 
    } // namespace B 
    namespace D { 
     ::A::B::C::Foo foo; 
     // or 
     B::C::Foo foo 
    } // namespace D 
} // namespace A 

내가 완전히 C++ 표준의 3.4 장을 이해하지 못했지만, 나는 내가 STL 벡터 헤더에 설명 할 수없는 무언가를 보았다 :

예를 들어 (I 가독성 여기 네임 스페이스를 들여) (읽기 쉽도록 단순화) : 것은이 _STD이 :: ..하지만 이름에 대한 이해에 따라 찾아 볼 표준을 ::하도록 확장되어

namespace std { 
    template<.. 
    class reverse_iterator 
    { ... }; 

    template<.. 
    class vector { 
     typedef _STD reverse_iterator<const_iterator> const_reverse_iterator; 
     ... 
    } 
} 

, reverse_iterator 벡터에 대한 조회했을 먼저에 std 인 부모 네임 스페이스. 충돌은 어떻게 가능합니까?

부수적 인 질문 : 템플릿의 이름에 대한 이름 조회 규칙은 인수가있는 함수입니까? 정규화 된 ID는 이미 ADL없이 선언 된 이름을 직접 볼 수는 있지만 정규화되지 않은 이름은 ADL을 수행한다고 생각합니다. 맞습니까?

미리 답변 해 주셔서 감사합니다.

+0

나는 항상 내 네임 스페이스를 정규화합니다. 컴파일러와 아무런 차이가 없지만 나중에 다시 돌아와 몇 년 후에 다시 볼 때 코드를 훨씬 쉽게 이해하고 탐색 할 수 있습니다. –

+0

가끔은 명확성을 위해서만 사용하지만 A :: 대신 ... 전역 범위 한정 :: A :: ...에 대해 더 궁금합니다. 필자는 3 가지 레벨의 네임 스페이스를 가지고 있으며, 전체 이름이 너무 길어 명료성의 이점을 얻기가 쉽지 않습니다. – ThiSpawn

답변

4

네 말이 맞아 자격이 불필요한 것 같습니다.

표준 라이브러리 코드에서 C++을 배우려고하지 마십시오. 하위 호환성, 이식성, 대체 구성 (예 : 모든 구성 요소 사용 안 함)을 비롯하여 사용자에게 해당되지 않는 다양한 이유로 매우 특수한 스타일로 작성되어야합니다 역사 컴파일러의 네임 스페이스). 그것은 몇 가지 구성으로 _STD는 다른 무언가로 확장, 아니면 그냥 중복의 가능성이 있습니다 가능성이 있습니다 (하지만 무해한.)

어떤 인자가있는 템플릿 함수의 이름에 대한 이름 조회 규칙을 것입니까? 정규화 된 ID는 이미 ADL없이 선언 된 이름을 직접 볼 수는 있지만 정규화되지 않은 이름은 ADL을 수행한다고 생각합니다. 맞습니까?

예, ADL은 규정되지 않은 이름에만 적용됩니다.

관련 문제