在C ++中,假设您有两个函数定义:
template <typename T>
T square (T num);
和
double square(double num);
你有一个函数调用,如:
square(1.5);
会调用哪个函数?编译器选择哪个?
答案 0 :(得分:3)
参数1.5
的类型为double
,因此它与模板和非模板完全匹配。在这种情况下,根据标准中的[over.best.match],非模板函数将是首选:
...
F1
被定义为更好函数,而不是...F2
如果...F1
不是函数模板特化,F2
是一个功能模板专业化...
如果您使用square
或int
参数调用float
,模板将再次提供完全匹配,但您需要转换或提升非模板。将选择模板,因为它更匹配。
答案 1 :(得分:2)
在这种情况下,C ++总是喜欢非模板版本的函数,因为它可以轻松地将float提升为double。
你使用过这个: -
float p = 2.2;
square(p);
编译器会选择模板版本进行完美匹配。
答案 2 :(得分:1)
由于调用语法与非模板函数匹配,因此它将被称为