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로 컴파일하지만 ...없는)
매개 변수를 사용하지 않는'A :: scope()'가 존재하지 않지만이 함수를 호출하기 때문에 코드가 모든 컴파일러에서 컴파일되지 않습니다. – Nawaz
하나의 컴파일러가 오래된 것이고 다른 하나는 새로운 것입니까? 아니면 다른 제조업체의 컴파일러입니까? –
@Nawaz -> 편집 됨 ... – DocZeD