为什么f的第三个函数调用未使用函数模板?
#include <iostream>
using namespace std;
template<class T> void f(T x, T y) { cout << "Template" << endl; }
void f(int w, int z) { cout << "Non-template" << endl; }
int main() {
f( 1 , 2 );
f('a', 'b');
f( 1 , 'b');
}
答案 0 :(得分:2)
功能模板类型推导非常严格。对于每对函数参数和自变量,推导都是孤立进行的,然后对推导结果进行比较:
[温度扣除类型]
2在某些情况下,推导是使用一组类型P和 A,在其他情况下,将存在一组对应的类型P和A。 每个P / A对的类型推导都是独立完成的,并且 然后将推导的模板参数值组合在一起。如果类型扣除 不能对任何P / A对执行,或者对于任何对都不能进行扣除 导致一组以上的推论值,或者如果推导值不同 对产生不同的推导值,或者如果有任何模板参数 模板参数既不推断也不明确指定 推论失败。
这意味着x
的类型是从1
(和int)推导的,而y
的类型是从'b'
(一个字符)推导的,就像其他参数不存在。此推论分别产生T = int
和T = char
,并且由于它们是不同的类型,因此推论必须按照上述段落明确失败。
如果想调用实例化函数,则必须自己明确指定T
:
f<int>( 1 , 'b');
f<char>( 1 , 'b');
答案 1 :(得分:0)
在第三次调用中,两个参数的类型不同,因此无法推论T
,并且模板函数不可行。那么,非模板的人是唯一可行的候选人。
答案 2 :(得分:0)
在第三个调用中,第一个参数是int
,第二个参数是char
,因此它与模板声明不匹配。但是,可以将char
隐式转换为int
,然后调用专业化。