2011-04-12 3 views
2

는 사람이 컴파일러는 두 개의 다음과 같은 경우에서와 다른 무엇을 말해 줄 수 있습니까?반환 유형에 대한 오버로드 기능? (재 방문)

#include <cstdio> 
    using namespace std; 

    template <typename TReturn, typename T> 
    TReturn convert(T x) 
    { 
     return x; 
    } 

    int main() 
    { 

     printf("Convert : %d %c\n", convert<int, double>(19.23), convert<char, double>(100)); 
     return 0; 
    } 

int convert(double x) 
{ 
    return 100; 
} 

char convert(double x) 
{ 
    return 'x'; 
}   

int main() 
{ 
    printf("Convert : %d %c\n", convert(19.23), convert(100));  // this doesn't compile 
    return 0; 
} 

는 첫 번째 경우는 함수 오버로딩을하지 않습니다?

컴파일러가 템플릿 기능이 호출 발생
+8

무효에있는 당신의 두 번째 경우. 컴파일하는 유일한 이유는'convert' 대신에'covert'를 입력했기 때문입니다. 반환 유형 만 다른 동일한 이름을 가진 두 함수를 선언 할 수 없습니다. –

답변

7

는 자동 실제 템플릿 파라미터 (이 경우 두 번)로 전달되는 종류별 각 모양을 대체하는 기능을 생성하는 템플릿을 사용하고이를 호출한다. 이 프로세스는 컴파일러에 의해 자동으로 수행되며 프로그래머에게는 보이지 않습니다. 따라서 데이터 추상화 및 숨기기도 구현합니다.

컴파일러는 정상적인 기능 또는 클래스와 같은 템플릿을 취급하지 않습니다. 요구 사항에 따라 컴파일됩니다. 즉, 템플릿 함수의 코드는 필요할 때까지 컴파일되지 않습니다.

둘째 exmaple 과부하되지 않습니다. 개 심자 철자가 잘못되었습니다.

관련 문제