#include <iostream>
using namespace std;
template <typename T> void compare(const T&, const T&){
cout<<"T"<<endl;
}
void compare(const char*, const char*){
cout<<"const char*"<<endl;
}
int main()
{
char a[]="123";
char b[]="123";
char *p1 = a, *p2 = b;
compare(p1,p2);
return 0;
}
结果是:T
但为什么呢?实例化后,模板函数可能如此:
compare(const char *&amp;,const char *&amp;)
与普通功能相同。应该调用普通函数!
答案 0 :(得分:2)
这就是为什么我认为写T const&
优于写const T&
。
模板函数使用签名void(char* const&, char* const&)
进行实例化,该签名比void(char const*, char const*)
更好,因为它不需要从char*
到char const*
的指针转换。< / p>
答案 1 :(得分:1)
T
被推断为char *
,它提供完全匹配。对于另一个超载,你必须说,
compare(static_cast<char const *>(p1), static_cast<char const *>(p2));
使其更好地匹配。
(或者首先将p1
和p2
声明为char const *
。)
答案 2 :(得分:0)
将a
和b
分配给const不会使它们成为常量,这可能是混淆的根源。你如何宣称它们是更重要的部分。我相信你需要将它们声明为Kerrek SB所说的,以获得你所追求的......