2012-04-24 53 views
5

在以下代码中,主功能使用普通功能而不是模板功能。正常功能和模板功能之间的优先级

#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; 
} 

背后有什么可能的原因?

+2

功能最佳匹配论点首先被选中。 – Anycorn 2012-04-24 03:39:20

+0

@Anycorn:在C++中,默认选择第一个正常的函数吗? – IndieProgrammer 2012-04-24 03:43:52

+0

让我澄清 - 如果一个正常的函数匹配*类型*,它将被选中。例如,如果它是'num(char a)',则会选择temlate。 – Anycorn 2012-04-24 03:48:07

回答

4

要在这种情况下调用模板方法,您需要明确调用方法num<int>(5)而不是num(5)。尽管编译器可以推断,但非泛型方法优于通用方法。你可以在这里看看这个行为http://ideone.com/ccDJP

+0

感谢。我希望听到这种说法“虽然编译器可以推断,它会更喜欢非泛型方法泛型一个”。 – IndieProgrammer 2012-04-24 03:46:03

+0

是的,如果你想想看,使用非通用的原因在文本中创建一个新的模板方法(C++模板基本上复制了所用的每不同类型的方法)。为什么要通过努力,如果有一个已经:) – 2012-04-24 03:47:30

+0

替代的方式来调用模板变种'NUM <>(5);'。 – legends2k 2014-06-18 15:25:29

7

看看香草萨特的优秀文章"Why not specialize function templates?"

引述:

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

  1. 非模板函数是一等公民。一个与参数类型匹配的普通的旧模板函数以及任何函数模板都将通过其他函数模板进行选择。

  2. 如果没有一流的公民可以选择至少一样好,那么函数库模板作为第二级公民接下来会被咨询。哪一个函数库模板被选择取决于哪一个匹配最好,并且是“最专业的”(重要的注意:这种“专业化”的用法足够奇怪地与模板专业化无关;它只是一个不幸的口语)根据一组公平的奥术规则:

    • 如果很清楚,有一个“最专业的”功能库模板,那么就可以使用该模板。如果该基础模板碰巧专用于正在使用的类型,则将使用专业化,否则将使用使用正确类型实例化的基础模板。

    • 否则,如果“最专业的”功能库模板存在匹配关系,则调用不明确,因为编译器无法确定哪个匹配更好。程序员将不得不做一些事情来限定呼叫并说出哪一个是想要的。

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

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