C++模板函数匹配顺序

C++模板函数有的匹配顺序主要如下:

  1. 常规函数
  2. 显式具体化函数
  3. 显式实例化函数
  4. 常规模板

注意:模板实例化在template后面是没有加<>的,而模板具体化后面是有加的。
模板实例化是一个声明,不能带函数体的。

模板实例化的具体作用还不是很清楚,但是知道有以下的一个作用:
根据 “在同一文件中使用同类型的显示实例化和显示具体化会报错的特点”,先声明显示实例化,则后面的显示具体化如果存在,会报错,从而防止具体化该型模版!!

示例代码:

#include <iostream>
#include <string>

using namespace std;

//模板函数
template <typename T>
void display(T t)
{
    cout << "sizeof(T) = " << sizeof(T) << endl;
    cout << "template function" << endl;
    cout << "value = " << t << endl;
}

// 显式具体化模板函数
template <>
void display<string> (string t)
{
    cout << "template function for string" << endl;
    cout << "value = " << t << endl;
}

// 显式实例化
template void display<double> (double);

// 非模板函数
void display(float t)
{
    cout << "function for float" << endl;
    cout << "value = " << t << endl;
}

int main()
{
    // 调用模板函数
    int i = 10;
    display<int> (i);

    //调用显式具体化函数
    string str = "test";
    display(str);

    //调用非模板函数
    float f = 8.88;
    display(f);

    double d = 1.11;
    display(d);


    return 0;
}
// vim: set et ts=4 sts=4 sw=4:

输出结果是:

sizeof(T) = 4
template function
value = 10
template function for string
value = test
function for float
value = 8.88
sizeof(T) = 8
template function
value = 1.11