2017-04-02 4 views
0

:C++에서 템플릿 반환 유형 함수는 어떻게 작동합니까? 다음 예에서

template<typename T> 
T Get() 
{ 
    T t = 10; 
    return t; 
} 

int main() 
{ 
    int i = Get<int>(); // will work 
    float f = Get<float>(); // will work 
} 

기능 오버로드는 다른 반환 형식이 작동하지 않습니다. 그렇다면이 경우 컴파일러는 무엇을 생성합니까?

+1

코드에 많은 오류가 있기 때문에 컴파일러는 아무 것도 생성하지 않습니다. –

+2

@NeilButterworth 오류를 생성하는 코드에는 정확히 한 줄의 문자열 ('i' 재사용과 형식 지정없이'Get')이 있습니다.이 줄은 컴파일되지 않습니다. 사람들은 일반적으로 동시에 사용할 수있는 것이 아닌 작동하는 사례와 그렇지 않은 사례를 보여주는 여러 병렬 선을 작성합니다.이 선은이 질문에 분명하게 표기되어 있습니다. 그래서 저는 그것이 공정한 비판이라고 생각하지 않습니다. – jwimberley

답변

0

Get<int> 또는 Get<double>을 통해 함수를 호출하면 컴파일러에서 반환 형식을 추론 할 필요가 없습니다. T t = 10 코드는 캐스팅 작업을 수행하여 T을 입력합니다. 이 코드는이 경우 T t = static_cast<T>(1.5);이 더 나은 선택이 될 수도

warning: implicit conversion from 'double' to 'int' changes value from 1.5 to 1 [-Wliteral-conversion] 

경고를 생성 않습니다 일부 컴파일러,

template<typename T> 
T Get() 
{ 
    T t = 1.5; 
    return t; 
} 

main() 
{ 
    int i = Get<int>(); // returns 1 
    double f = Get<double>(); // returns 1.5 
} 

그러나 : 101.5 같은 비 정수로 교체 할 경우 이는 더 분명하다 .

+0

@ user4815162342 감사합니다. – jwimberley

0

컴파일러는 각기 다른 데이터 형식에 대한 코드를 복사합니다. 귀하의 예에서 T 대신 int가있는 코드가 생성되고 float도 동일합니다. 이것은 컴파일하는 동안 일어나는 일이므로, 컴파일러는 당신이 필요로하는 것을 알지 못하기 때문에 데이터 타입을 함수에 선언해야합니다.