正常功能和模板功能的优先级(Priority between normal function and

2019-06-23 21:33发布

在下面的代码,主要功能使用正常的功能,而不是模板函数。

#include <iostream>

using namespace std;

template <class T>
void num(T t){cout<<"T : "<<t;}

void num(int a){cout<<"wT : "<<a;}


int main()
{
    num(5);
    return 0;
}

这背后的原因可能?

Answer 1:

要调用模板方法在这种情况下,你需要用显式调用该方法num<int>(5)而不是num(5) 虽然编译器可以推断,非通用方法是优选的,以一个通用的一个。 你可以看看这种行为在这里http://ideone.com/ccDJP 。



Answer 2:

看看香草萨特的优秀文章“为什么不专注函数模板?”

报价:

“最后,让我们只专注于函数模板,并考虑超载规则,看看哪些被调用在不同情况下的规则很简单,至少在一个较高的水平,并且可以表示为一个典型的两班制:

  1. 非模板函数是一等公民 。 相匹配的参数类型普通的老式非模板函数以及任何函数模板将通过一个可否则,刚刚因为良好的函数模板中选择。

  2. 如果没有一等公民从选择的至少一样好,那么函数库模板作为二等公民获得下一咨询。 其功能基本模板被选中取决于最匹配,是“最专业”(重要说明:此使用的“专业”奇怪的是没有任何与模板特,它只是一个不幸的口语)根据一组相当神秘的规则:

    • 如果很显然,有一个“最专业”的功能基本模板,一个被使用。 如果基本模板恰好是专门针对正在使用的类型,专业化会习惯,否则用正确的类型实例化的基本模板将被使用。

    • 否则,如果有一个为“最专业”的功能基本模板领带,因为编译器不能决定哪个是更好的匹配通话是模糊的。 程序员必须做一些事情来限定打电话说哪一个是通缉。

    • 否则,如果有可以进行符合无功能基础模板,通话不好,程序员必须解决的代码。”

在你的代码示例,如由David Z.,非模板函数指出void num(int a)将被选中,因为它是在第一条规则匹配。 任何其他函数模板将只考虑他们是否有更好的匹配



文章来源: Priority between normal function and Template function