2

次のコードを書きました。

template <typename T>
void  myname(T* x)
{
    cout<<"x is "<<x;
}

そして私は呼び出しました:

char *p="stackOverflow";
myname(p);

印刷しstackOverflowます。

しかし、テンプレート引数を から に変更する (T* x)(T x)、同じ結果が得られます。

では、2 つのテンプレート パラメーターの違いは何でしょうか?

void  myname (T x)  

void myname (T* x)
4

3 に答える 3

3

最初のケース -Tは char と推定されるため、T*になりますchar*。2 番目のケース -Tは と推定されchar*ます。ここでの違いは、そのような関数の呼び出しにあります

最初のケースは

myname<char>(p);

そして2番目に

myname<char*>(p);

Tまた、タイプイン関数を使用する場合にも違いがあります。

于 2013-04-25T10:59:30.270 に答える
1

関数で T を使用すると、違いが明らかになります

char *p="stackOverflow";
myname(p);

template <typename T>
void  myname(T* x)
{
    cout<<"x is "<<x;
    T t;                 // This is char now
}

ただしこれで

template <typename T>
void  myname(T x)
{
    cout<<"x is "<<x;
    T t;                 // This is char* now
}

于 2013-04-25T11:00:32.727 に答える
1

どちらの場合も、コンパイラはテンプレート引数を推定して、関数引数の型に一致する関数を生成しますchar *

T = char最初のケースでは、与えられたテンプレートをインスタンス化しますvoid myname<char>(char* x)

T = char*2 番目のケースでは、指定してインスタンス化しますvoid myname<char*>(char* x)

また、文字列リテラルは定数であり、非 const ポインターを指すべきではないことに注意してください。

于 2013-04-25T11:02:17.130 に答える