1
#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

但为什么?实例化后模板函数可能是这样的:

比较(常量字符*&,常量字符*&)

与普通功能相同。应该调用普通函数!

4

3 回答 3

2

这就是为什么我认为写作T const&优于写作const T&

模板函数使用void(char* const&, char* const&)比 更好匹配的签名来实例化void(char const*, char const*),因为它不需要指针从char*到的转换char const*

于 2012-08-02T11:24:30.400 回答
1

T推导出为char *,这给出了完全匹配。对于另一个超载,你不得不说,

 compare(static_cast<char const *>(p1), static_cast<char const *>(p2));

使其成为更好的匹配。

(或者首先声明p1and 。)p2char const *

于 2012-08-02T11:22:09.300 回答
0

a将和分配b给 const 不会使它们成为 const 的,这可能是混淆的根源。你如何声明它们是更重要的部分。我相信你需要像 Kerrek SB 所说的那样声明它们,以获得你想要的东西......

于 2012-08-02T11:35:53.210 回答