正常功能和模板功能之间的优先级

Ind*_*mer 6 c++ templates overloading

在下面的代码中,main函数使用普通函数而不是Template函数.

#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;
}
Run Code Online (Sandbox Code Playgroud)

这背后可能的原因是什么?

Tem*_*Rex 8

看看Herb Sutter的优秀文章"为什么不专门化功能模板?"

报价:

"最后,让我们只关注函数模板,并考虑重载规则,看看在不同的情况下调用哪些规则.规则非常简单,至少在很高的层次上,可以表示为经典的两类系统:

  1. 非模板功能是一等公民.一个与参数类型以及任何函数模板匹配的普通旧的非模板函数将被选择在另外一样好的函数模板上.

  2. 如果没有一流的公民可供选择至少同样好,那么接下来就咨询二级公民的功能基础模板.选择哪个功能基础模板取决于哪个匹配最好并且是"最专业的"(重要说明:这种"专用"的使用奇怪地与模板专业化无关;它只是一个不幸的口语)根据一组公平奥术规则:

    • 如果很明显有一个"最专业"的功能基础模板,那么就会使用它.如果该基本模板碰巧专门用于所使用的类型,则将使用特化,否则将使用使用正确类型实例化的基本模板.

    • 否则,如果"最专业"的函数库模板存在并列,则调用不明确,因为编译器无法确定哪个是更好的匹配.程序员必须做一些事情才能使电话有资格并说出想要的电话.

    • 否则,如果没有可以匹配的功能基础模板,则调用很糟糕,程序员必须修复代码."

在您的代码示例中,正如David Z所指出的,void num(int a)将选择非模板函数,因为它在第一个规则中匹配.任何其他功能模板只有在更好的匹配时才会被考虑.


Dav*_* Z. 5

要在这种情况下调用模板方法,您需要使用num<int>(5)代替显式调用该方法num(5)。尽管编译器可以推断,非泛型方法优于泛型方法。您可以在http://ideone.com/ccDJP 上查看此行为。