2014-05-18 3 views
0

.cpp 파일에서 bubble_sort 알고리즘을 구현합니다. bubble_sort 함수 안에는 swap (a, b)를 사용합니다. 그러나 나는이 cpp 파일에서 "namespace std 사용"을 지정하지 않았습니다. (사실이 .cpp 파일에는 헤더가 없습니다.) 경고 나 오류없이 프로그램을 컴파일 할 수 있습니다. 그 bubble_sort 함수에서 관습적인 함수를 사용하고 싶다면 같은 파일에 함수를 선언해야합니다. 하지만 왜 스왑을 할 필요가 없는지 이해할 수 없습니다. 제대로, 당신이 를 인스턴스화한다 (적어도 MSVC로) 템플릿 코드를 테스트하기 위해,정규화되지 않은 "std :: swap"함수를 사용하여이 코드가 컴파일되는 이유는 무엇입니까?

bubble_sort.cpp

template <typename Type> 
void bubble_sort(Type* originarray, int lengthofarray) 
{ 
    int ii=lengthofarray-1; 
    while(ii>0) 
    { 
     for (int jj=0;jj<ii;jj++) 
     { 
      if (originarray[jj]>originarray[jj+1]) 
       swap(originarray[jj],originarray[jj+1]); 
     } 
     ii--; 
    } 
} 
+0

전역 범위에 도입 한 비표준 컴파일러 동작 (일부 무례 라이브러리) 일 수 있습니다. 나는이 사용이 ADL을 여기에서 보증하지 않는다고 생각한다. –

+7

함수가 템플릿입니다. 실제로 그것을 인스턴스화하고 있습니까? – arx

+0

그리고 이것을 인스턴스화하는 경우'std' 네임 스페이스의 한 유형 또는'std' 네임 스페이스의 유형에서 파생 된 유형으로 인스턴스화 할 수 있습니까? – hvd

답변

1

첫째 : 다음은 내 CPP 파일입니다.

std 네임 스페이스에있는 클래스로 코드를 시도하면 ADL (Koenig) lookup을 통해 컴파일러에서 std::swap()을 선택할 수 있습니다.

+0

동료의 이름은 Andrew Koenig, Keonig가 아닙니다. 이름을 올바르게 표시하는 것은 표시 한 것처럼 까다로울 수 있으며 잘못 표시하는 것은 무례한 것으로 간주 될 수 있으므로 ADL로만 부르는 것이 좋습니다. – hvd

+0

오타를 지적 해 주셔서 감사합니다. 물론, 나는 무례 함을 의미하지는 않았다. 나는 이름을 고쳤다. –

관련 문제