1

以下に、2 つのプログラムとその出力を示します。

コード 1:

   #include<iostream>
    using namespace std;

    template <class X,class Y> X sumargs(X a,Y b)
    {
        cout<<"\nThe sum is :" << a+b; 

    }

    int sumargs(int a,char b)
    {
      cout<<"\nThis works\n";
      return 1;
    }

    int main()
    {

        sumargs<int>(1,2);
        sumargs<char>(4,9.0);
        sumargs<double>('d',8);
        sumargs(7,'a');
        return 0;
    }

出力 1:

The sum is :3
The sum is :13
The sum is :108
This works

コード 2:

#include<iostream>
using namespace std;

template <class X,class Y> X sumargs(X a,Y b)
{
    cout<<"\nThe sum is :" << a+b; 

}

int sumargs(int a,char b)
{
  cout<<"\nThis works\n";
  return 1;
}

int main()
{

    sumargs<int>(1,2);
    sumargs<char>(4,9.0);
    sumargs<double>('d',8);
    sumargs<int>(7,'a');
    return 0;
}

出力 2:

The sum is :3
The sum is :13
The sum is :108
The sum is :104

なぜsumargs(7,'a'); コード 2では、関数の明示的にオーバーロードされたバージョンを呼び出していませんか?

4

3 に答える 3

5

ここ:

sumargs<int>(7,'a');
//     ^^^^^

テンプレート引数を明示的に指定しています。テンプレート引数を明示的に指定しているため、コンパイラは関数テンプレートのみを考慮して呼び出しを解決します。

オーバーロードはテンプレートではなく、非テンプレートはテンプレート引数を受け入れません。したがって、コンパイラはそれを考慮しません。

于 2013-06-13T16:54:50.793 に答える