为什么调用一般模板功能?

时间:2012-08-02 11:19:23

标签: c++

#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;)

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

3 个答案:

答案 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));

使其更好地匹配。

(或者首先将p1p2声明为char const *。)

答案 2 :(得分:0)

ab分配给const不会使它们成为常量,这可能是混淆的根源。你如何宣称它们是更重要的部分。我相信你需要将它们声明为Kerrek SB所说的,以获得你所追求的......