Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当重载方法将模板类作为参数时会发生什么_C++_Templates_Overloading - Fatal编程技术网

C++ 当重载方法将模板类作为参数时会发生什么

C++ 当重载方法将模板类作为参数时会发生什么,c++,templates,overloading,C++,Templates,Overloading,C++允许我们使用模板编写通用函数。它还具有函数重载的特点。 我编写了以下程序: #include <iostream> using namespace std; template <typename T> void test(T a) { cout<<"using template"; } void test(int a) { cout<<"using int"; } int main() { test(10);

C++允许我们使用模板编写通用函数。它还具有函数重载的特点。 我编写了以下程序:

#include <iostream>

using namespace std;
template <typename T>
void test(T a)
{
    cout<<"using template";    
}
void test(int a)
{
    cout<<"using int";
}
int main()
{

   test(10);
   return 0;
}

我想知道选择特定方法的依据是什么?

它的明显行为,实际参数与形式匹配。就模板而言,编译器不知道什么类型是t,对模板函数的调用也有不同的语法。

非模板函数比函数模板更匹配

参考(C++标准草案N3337):

13.3.3最佳可行功能

给定这些定义,如果对于所有参数i,ICSi(F1)不是比ICSi(F2)更差的转换序列,则可行函数F1被定义为比另一个可行函数F2更好的函数,然后

-F1是非模板函数,F2是函数模板专用化,如果不是

-F1和F2是函数模板专用化,F1的函数模板更专用 根据14.5.6.2中所述的偏序规则,F2的模板


因此,在运行时,它首先找到具有精确数据类型的原型。如果它没有找到它,那么它会选择参数类型t。对吗?错,如果参数与调用的函数相匹配(数值类型之间存在弱类型检查),运行时甚至编译器都不知道t应该是int,您必须在函数调用中显式地提到t是int。
using int