函数模板可以被另一个模板或普通函数重载,函数匹配规则有所改变:
(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,由于第一个模板更通用,所以将会匹配第二个
京公网安备 11010502036488号