2

テンプレートについて読み始めましたが、以下で混乱しました。

template<class T>
T max(T t1, T t2)
{
   if (t1 > t2)
      return t1;
   return t2;
}

int main(){
   std::cout<<max<int>(120,14.55);
   return 0;
}

出力は 120 です。しかし、上記をコンパイルすると、次の警告が表示されました。

warning:passing double for argument 2 to T max(T, T) [with T = int].

私の質問は、 のインスタンス化を既に行っているため、この警告が表示された理由ですT max(int t1,double t2)

ここでの私の理解によると、明示的に 1 つのデータ型 (ここでは ) のみを言及すると、コンパイラによってint引数の型 ( ) から他の型が差し引かれます。14.55つまり、この場合はT max(T t1, T t2)インスタンス化されます。T max(int t1,double t2)この概念は、インターネット上のいくつかのテンプレート ドキュメントから読みました。

疑問を解消してください。そうしないと先に進めません。

4

3 に答える 3

2

特定のテンプレートには、テンプレート パラメータが 1 つしかありませんT。つまり、max<int>これが作成されます。

int max(int t1, int t2)

max(int, double)このテンプレートから生成する方法はありません。混合型の引数が必要な場合、テンプレートは次のようになります。

template <typename T1, typename T2>
/*some return type*/ max(T1 t1, T2 t2)

ただし、現在、戻り値の型がどうあるべきかを判断するのは簡単ではなく、type_traitsおそらくそのような関数の正しい戻り値の型を導出する必要があります。

于 2012-12-04T10:58:57.810 に答える
1
std::cout << max<int>(120,14.55);

この行は関数 int max(int, int) の使用と同等であるため、コンパイラは 14.55 から 14 への変換について警告を出します - データが失われる可能性があります。

異なるタイプのデータを比較したい場合は、使用する必要があります

template<class T, class T1, class T2>
T max(T1 t1, T2 t2)
{
   if (t1 > t2)
      return T(t1);
   return T(t2);
}

後で main.cpp で:

float a = max<float, int, double>(10, 11.0);

しかし、それは最善の方法ではありません。

于 2012-12-04T10:55:01.500 に答える
0

この警告が表示された理由は、私がすでに のインスタンスを作成しているので、私の質問ですT max(int t1,double t2)

いいえ、していません。テンプレートパラメーターintとして指定すると、パラメーターのすべての出現箇所が次のように置き換えられて、テンプレートがインスタンス化されますint

T max(T t1, T t2)    becomes    int max(int t1, int t2)

ここでの私の理解によると、1 つのデータ型 (ここでは int) のみを明示的に言及すると、他の型は引数の型から差し引かれます。

いいえ、テンプレートにはパラメーターが 1 つしかなく、両方の関数引数の型に使用されます。したがって、そのパラメーターを指定すると、両方 (および戻り値の型) に使用されます。これらを個別にパラメータ化する場合は、それぞれに個別のパラメータが必要です。

template <typename T1, typename T2>
???? max(T1 t1, T2 t2)

戻り値の型を指定する最善の方法は、演習として残されています。

ここで、最初の引数のみを指定すると、2 番目の引数は関数の 2 番目の引数から推定されます。

max<int>(120,14.55);  // T1=int given, T2=double deduced -> max(int,double)
max(120,14.55)        // T1=int, T2=double both deduced  -> max(int,double)
于 2012-12-04T11:03:03.027 に答える