参数不同时,重载解析不会选择模板

时间:2019-04-28 03:43:24

标签: c++ c++11

为什么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');
}

3 个答案:

答案 0 :(得分:2)

功能模板类型推导非常严格。对于每对函数参数和自变量,推导都是孤立进行的,然后对推导结果进行比较:

  

[温度扣除类型]

     

2在某些情况下,推导是使用一组类型P和   A,在其他情况下,将存在一组对应的类型P和A。   每个P / A对的类型推导都是独立完成的,并且   然后将推导的模板参数值组合在一起。如果类型扣除   不能对任何P / A对执行,或者对于任何对都不能进行扣除   导致一组以上的推论值,或者如果推导值不同   对产生不同的推导值,或者如果有任何模板参数   模板参数既不推断也不明确指定   推论失败。

这意味着x的类型是从1(和int)推导的,而y的类型是从'b'(一个字符)推导的,就像其他参数不存在。此推论分别产生T = intT = char,并且由于它们是不同的类型,因此推论必须按照上述段落明确失败。

如果调用实例化函数,则必须自己明确指定T

f<int>( 1 , 'b');
f<char>( 1 , 'b');

答案 1 :(得分:0)

在第三次调用中,两个参数的类型不同,因此无法推论T,并且模板函数不可行。那么,非模板的人是唯一可行的候选人。

答案 2 :(得分:0)

在第三个调用中,第一个参数是int,第二个参数是char,因此它与模板声明不匹配。但是,可以将char隐式转换为int,然后调用专业化。