定义一个函数模板:
template<typename T> int compare(T, T)
{
……
}
再定义一个普通函数
int compare(const char *, const char *)
{
……
}
int main()
{
const char ch_arr1[] = "world", ch_arr2[] = "hi";
const char *p1 = ch_arr1, *p2 = ch_arr2;
compare(ch_arr1, ch_arr2);
compare(p1, p2);
return 0;
}
红色部分的两个compare函数调用的都是普通函数,C++ primer的解释是,在上述两种情况下,普通函数和函数模板都完全匹配。像通常一样,当匹配良好时,非模板版本优先。实际在vs2010运行结果与书上一致。
我的疑问是:compare(p1, p2)确实完全匹配,调用非模板版本正常,但是compare(ch_arr1, ch_arr2)调用非模板版本时,需要将数组ch_arr1和ch_arr2转化成指针,而函数模板才是完全匹配,那不应该调用函数模板吗?请大家指教,难道对普通函数而言,数组到指针的转化可以忽略不计?我知道对模板匹配的时候不可以忽略的,看C++primer刚碰到这个问题,苦恼不已,谢谢。 |