반올림 값을 반환하기 전에 반올림해야하는 유형을 정의하는 추가 템플릿 인수로 간단한 라운드 템플릿 함수를 만들었습니다.오버로드로 부분 템플릿 전문화
template <typename T, typename U>
T round(U val) {
T result;
if (val >= 0)
result = (T)(floor(val + (U)(.5)));
else
result = (T)(ceil(val - (U)(.5)));
return result;
}
int a = round<int>(5.5); // = 6
// no compiler warnings
하지만 추가 템플릿 인수를 남겨 두어 이미 인수로 추가 한 유형을 삽입하지 않아도됩니다.
template <typename T>
T round(T val) {
return round<T>(val);
}
double b = round(5.5) // = 6.0
// C2668
그러나, 이제 컴파일러는 불평 :
오류 C2668을 : 내가 생각
오버로드 된 함수에 대한 모호한 전화를 항상을해야하는 가장 구체적인 템플릿을 선택할 것 컴파일러 마지막 것. 왜 이것이 사실이 아니며 해결 방법이 있습니까 (특히이 라운드 기능에는 해당되지 않음)?
애매한 호출 round(5.5)
를 가리키는 것이 아니라에 return round<T>(val);
되지 않았습니다. 이 질문에 대한 답변은 오버로드 된 함수의 반환 값을
return round<T,T>(val);
으로 다시 작성하여 문제를 해결하는 것입니다.
the answer-my other question에 대해 galop1n에게 감사드립니다.
마지막 하나는 다른 것보다 구체적이지 않습니다. – user3286380
'라운드'는 자신이 생각하는 것과 다릅니다 (예 : ['a'는 5와 같습니다] (http://coliru.stacked-crooked.com/a/4ab101714d2ef8ba)). – TemplateRex
@TemplateRex : 예 오타를 만들었습니다. 지금 수정되었습니다 – Didii