函数模板可以被另一个模板或普通函数重载,函数匹配规则有所改变:
(1)候选函数包括所有模板实参推断成功的函数模板实例
(2)按照类型转换排序,模板能调用的转换是很有限的
(3)若优先级相同,只有一个普通函数选择普通函数,都是模板选择更特例化的模板

编写重载模板

template<typename T> string debug_rep(const T &t)
{
    ostringstream ret;
    ret << t;
    return ret.str();
}

template<typename T> string debug_rep(const T *p)
{
    ostringstream ret;
    ret << p;
    if(p)
        ret << "" << debug_rep(*p);
    else
        ret << "null pointer";
    return ret.str();
}

const string *sp = &s;
cout << debug_rep(sp) << endl;
//两个都可以,第一个T会被绑定为string*,第二个被绑定为const string,由于第一个模板更通用,所以将会匹配第二个