1

printMax以下のプログラムで、関数の呼び出しではなく、テンプレート関数の呼び出しに対してコンパイラがエラーを生成するのはなぜprintMaxIntsですか?

#include <iostream>

template<class A>
void printMax(A a,A b)
{
   A c = a>b?a:b;

   std::cout<<c;
}

void printMaxInts(int a ,int b)
{
   int c = a>b?a:b;

   std::cout<<c;

}

int main()
{
   printMax(1,14.45);

   printMaxInts(1,24);
}
4

2 に答える 2

6

Aコンパイラが関数テンプレートに渡された引数からテンプレート パラメーターを推測するには、両方の引数が同じ型である必要があります ab

引数の型はintanddoubleであるため、コンパイラは に実際に使用する型を推測できませんA。あるべきですか、それともあるべきAですか?intdouble

これは、両方の引数を同じ型にすることで修正できます。

printMax(1.0, 14.45);

または、テンプレート パラメータを明示的に指定します。

printMax<double>(1, 14.45);

非テンプレート関数への呼び出しを呼び出すことができる理由は、コンパイラがパラメーターの型を推測する必要がないためです。関数宣言でパラメーターが何であるかを述べているため、パラメーターの型を認識しています。

void printMaxInts(int a, int b)

aとはどちらもbタイプintです。doubleこの関数に引数としてa を渡すと、引数に対してdouble -> int標準の変換が実行され、結果の で関数が呼び出されintます。

于 2010-08-28T18:04:35.050 に答える
1

次のコードは、James の回答に基づいています。条件式を取り出したことに気付くでしょう。これを行ったのは、その式の結果句が同じ型でなければならず、A と B に追加の制限が課されるためです。

このバージョンのコードでの A と B の唯一の要件は、それらを関連付ける operator<() があること (または、一方を他方に変換できること) と、必要な operator<<() 関数が存在することです。

template<typename A, typename B>
void printMax(A a, B b)
{    
    if (a < b) 
    {
        cout << b;
    }
    else 
    {
        cout << a;
    }
}
于 2010-08-28T19:23:53.610 に答える