템플릿 기능에 대해 읽고 있었고이 문제로 혼란스러워했습니다.
#include <iostream>
void f(int) {
std::cout << "f(int)\n";
}
template<typename T>
void g(T val) {
std::cout << typeid(val).name() << " ";
f(val);
}
void f(double) {
std::cout << "f(double)\n";
}
template void g<double>(double);
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // d f(int), this is surprising
g(1); // i f(int)
}
내가 쓰지 않으면 결과는 같습니다 template void g<double>(double);
.
나는 g<double>
이후 f(double)
에 인스턴스화해야 한다고 생각 하므로 f
in g
호출은 호출해야합니다 f(double)
. 놀랍게도, 그것은 여전히 호출 f(int)
에 g<double>
. 누구든지 이것을 이해하도록 도울 수 있습니까?
답을 읽은 후 혼란이 무엇인지 알아 냈습니다.
다음은 업데이트 된 예입니다. 다음에 대한 전문화를 추가 한 것을 제외하고는 대부분 변경되지 않았습니다 g<double>
.
#include <iostream>
void f(int){cout << "f(int)" << endl;}
template<typename T>
void g(T val)
{
cout << typeid(val).name() << " ";
f(val);
}
void f(double){cout << "f(double)" << endl;}
//Now use user specialization to replace
//template void g<double>(double);
template<>
void g<double>(double val)
{
cout << typeid(val).name() << " ";
f(val);
}
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // now d f(double)
g(1); // i f(int)
}
사용자 전문화 g(1.0)
로 예상대로 동작합니다.
컴파일러 g<double>
가 동일한 위치에서 (또는 C ++ 프로그래밍 언어 , 제 4 판 main()
26.3.3 섹션에 설명 된대로) 동일한 인스턴스를 자동으로 수행하지 않아야 합니까?
g(1)
는i f(int)
나를 위해 준다. 당신은 썼습니다d f(double)
. 오타입니까?