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

しかし、なぜ?インスタンス化後、テンプレート関数は次のようになります。

compare(const char *&、const char *&)

通常の機能と同じです。そして、通常の関数を呼び出す必要があります!

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

それをより良く一致させるために。

(または、最初に宣言p1p2char const *ください。)

于 2012-08-02T11:22:09.300 に答える
0

a、およびをconstに割り当てても、 bconstにはなりません。これは、混乱の原因となる可能性があります。それらをどのように宣言するかがより重要な部分です。Kerrek SBが言ったように、あなたが求めているものを手に入れるには、それらを宣言する必要があると思います...

于 2012-08-02T11:35:53.210 に答える