2011-05-12 4 views
5

C++의 표준 ADL 해상도에 관한 질문이 있습니다.템플릿 함수가있는 중첩 네임 스페이스의 C++ ADL

#include <string> 

// The mechanism: 
namespace A { 

template< class C > 
::std::string scope(const C*) 
{ return "A"; } 

namespace B { 

    template< class C > 
    ::std::string scope(const C *foo) 
    { return A::scope(foo)+"::B"; } 

} // namespace B 
} // namespace A 

::std::string scope(...) 
{ return ""; } 

// The test classes 
struct foo {}; 
namespace A { 
struct foo {}; 
namespace B { 
    struct foo {}; 
} 
} 

// The usage 
int main() 
{ 
    foo *Foo=0; 
    A::foo *FooA=0; 
    A::B::foo *FooB=0; 

    scope(Foo); // OK, returns "" 
    scope(FooA); // OK, returns "A" 
    scope(FooB); // On one compiler, OK returns "A::B" ; On another, compiler error "Ambiguous call" between A::scope() and A::B::scope() 
} 

그래서, 내 질문은 ADL에 대한 표준이 무엇이다 : 여기

은 샘플 코드는 내 질문을 설명한다? 인수의 상위 네임 스페이스에있는 모든 함수를 찾거나 인수의 중첩 된 네임 스페이스에서 사용할 수있는 함수와 전역 함수를 모두 검색해야합니까?

이 프로그램은 MSVC 2008에서 테스트되었습니다 (및 SP로 컴파일하지만 ...없는)

+0

매개 변수를 사용하지 않는'A :: scope()'가 존재하지 않지만이 함수를 호출하기 때문에 코드가 모든 컴파일러에서 컴파일되지 않습니다. – Nawaz

+0

하나의 컴파일러가 오래된 것이고 다른 하나는 새로운 것입니까? 아니면 다른 제조업체의 컴파일러입니까? –

+0

@Nawaz -> 편집 됨 ... – DocZeD

답변

5

이 표준에 따르면, ADL 작품 (특별 규칙의 몇 가지 모듈로) "와 같은 경우"기능 name 앞에는 네임 스페이스가 있습니다. 마지막으로 행에서 조회는 마치 A::B::scope으로 작성해야합니다. 어느 주변의 네임 스페이스를 보지 않습니다.

네임 스페이스 A::B 내에서도 모호성이 없습니다. in A::B, A::B::scopeA::scope입니다. 정규화되지 않은 이름 조회는 먼저 이름을 찾는 범위에서 을 중지합니다.

+0

James에게 감사합니다 , 이것은 정확히 내가 생각한 것입니다 :) 다시 시작하려면 모호함으로 인한 컴파일러 오류없이 컴파일해야합니다 ... 다시 MSVC에서 준수하는 표준 문제는 아닙니다./ – DocZeD

+0

@DocZeD VC 버전? –

+0

Working : 15.00.30729.01 - Not working : 15.00.21022.08 – DocZeD

관련 문제