C++ 模板函数实例化和专门化

C++ 模板函数实例化和专门化,c++,function,templates,C++,Function,Templates,模板函数有点混乱。我有以下资料: template <class T> T max (T v1, T v2) double max(double v1, double v2) // non template (1) 没有max的调用是否有效?编译器如何处理这个问题? (3vs4)编译器如何跟踪调用max(double>()v/s max()?函数模板重载有一些规则: 如果一个函数和一个专门化是同样好的匹配,则首选该函数 因此,max(double,double)优

模板函数有点混乱。我有以下资料:

template <class T> T max (T v1, T v2)

double max(double v1, double v2)        // non template 
(1) 没有max的调用是否有效?编译器如何处理这个问题?
(3vs4)编译器如何跟踪调用max(double>()v/s max()?

函数模板重载有一些规则:

如果一个函数和一个专门化是同样好的匹配,则首选该函数

因此,
max(double,double)
优于
max(double,double)

编译器可以区分普通函数、模板实例化候选函数和非模板函数,因为它们“更真实”


编译器如何区分函数?例如,它使用模板实例化的函数。确切的名称损坏方式是特定于编译器的。

所有这些都是完全有效的,如果输入/输出匹配,编译器将在大多数情况下找出您想要的内容


请注意,通过为
double
声明一个新的
max
函数,您已经告诉它您希望以一种特殊的方式处理它们,它将搜索您的特殊实现。这允许您在默认模板可能无法工作的情况下进行特殊处理。

当从重载中选择时,编译器首先检查非模板v由于不鼓励隐式转换,编译器不会认为它是一个完美的选择。然后编译器检查模板版本并找到它的真正的爱(两者都不需要改变它们自己,它们适合每个)。 <>但请考虑本案

double max(double v1, double v2);

template <typename T>
T max(double v1, double v2);

int a = max(1,2);
double max(双v1,双v2);
模板
T最大值(双v1,双v2);
int a=最大值(1,2);

如果编译器允许显示最高级别的警告(在VS中使用EX:W4),则编译器将选择非模板版本,从而得到警告C4244(Studio to int)。编译器在选择时不考虑返回值。

int a = max<int>(100.1, 200.1);  // specialization triggers input type conversion
double p = max<double>(100.1, 200.1);   // specialization
double p = max(100.1, 200.1);          // non-template function used
double max(double v1, double v2);

template <typename T>
T max(double v1, double v2);

int a = max(1,2);