2013-06-14 4 views
3

: 그러나 내가 가지고있는C++ 네임 스페이스 해상도 (인수에 따라 "사용하여 자동"?) 나는이 네임 스페이스 외부에서 네임 스페이스에 선언 된 함수를 호출 할 때, 나는 보통 명시 적으로 네임 스페이스 접두사 할 필요가

namespace ns1 { 
    void myfunc(); 
} 

myfunc();  // compiler complains 
ns1::myfunc(); // good 

이 컴파일러는 자동으로 내가 사용하고 싶은 기능을 고안 할 수 보이는이 상황 :

namespace mymath { 
    struct Vector3 { 
     float x, y, z; 
    }; 
    Vector3 vector_cross(const Vector3& lhs, const Vector3 &rhs) 
    { 
     return lhs; // Pretend this is a cross product 
    } 
} // ns 

int main(int argc, char** argv) 
{ 
    mymath::Vector3 v, w, x; 
    x = vector_cross(v, w); // <---- Here, I do not need to 
           //  prefix with the namespace 
    return 0; 
} 

Q1 : 그것은 컴파일러가 자동으로 인수 유형에 따라 적절한 기능을 선택할 수 있기 때문에? 또는 다른 것?

namespace mymath { 
    // same as above 
} // ns 

namespace math2 { 
    mymath::Vector3 vector_cross(const mymath::Vector3& lhs, const mymath::Vector3 &rhs) 
    { 
     return rhs; // Return rhs this time 
    } 
} // ns 

int main(int argc, char** argv) 
{ 
    mymath::Vector3 v, w, x; 
    x = vector_cross(v, w); // <---- Here, which one did the compiler chose? 
    return 0; 
} 

Q2 :


이 더 많은 테스트 후, 나는 다른 네임 스페이스에서 같은 선언으로 다른 기능을 추가하면 내 컴파일러는 불평하지 않는 것을 발견은 어떻게 I 드 이 동작을 활성화 하시겠습니까?

편집 : 제 컴파일러 : gcc version 4.7.2 (Debian 4.7.2-5)

+6

"인수 별 조회"는 검색어입니다. – GManNickG

+0

작업 예제를 게시해야하는 이유 중 하나는 그러한 예제를 직접 시도했음을 보여주고 위의 코드를 사용하여 "사용"문을 사용하는 것입니다. 또는 mymath 내에 범위가 지정된 내부에서 vector_cross를 호출 할 수 있습니다. 나는 최소한의 재현을 찾고 그 원인을 밝힐 것을 제안합니다. – kfsone

+0

@GManNickG : 고맙습니다. 이것을 확인하겠습니다. –

답변

3

Q1 : '적절한'논쟁이 있지만, 기본적으로 네, 많은 샘플 잘 작동 "관련"네임 스페이스의 모든 종류의 결합 기능을 선택합니다.

질문 2 : 수십 명의 사람들이 WG21에 가입하고 마지막으로 'ADL 수정안'제안 중 하나에 대해 투표를 실시합니다. 지금까지 시도 횟수가 줄어 들었습니다.

Q2, 실용적인 답변 : ADL은 정규화되지 않은 조회에만 적용되므로 정규화 된 이름을 사용할 수있는 옵션이 항상 있습니다. (접두사 :: std :: 등등 ...). 또는 네임 스페이스를 완전히 사용하지 마십시오. 그 외의 경우에는 "Koenig 불확실성 원칙"의 적용을받습니다.