C++中的模板 - 为什么不调用显式函数?

Inq*_*ive 1 c++ templates

下面我给出两个程序及其输出.

代码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;
    }
Run Code Online (Sandbox Code Playgroud)

输出1:

The sum is :3
The sum is :13
The sum is :108
This works
Run Code Online (Sandbox Code Playgroud)

代码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;
}
Run Code Online (Sandbox Code Playgroud)

输出2:

The sum is :3
The sum is :13
The sum is :108
The sum is :104
Run Code Online (Sandbox Code Playgroud)

为什么是sumargs(7,'a'); 代码2中没有调用函数的显式重载版本?

And*_*owl 5

这里:

sumargs<int>(7,'a');
//     ^^^^^
Run Code Online (Sandbox Code Playgroud)

要指定模板参数明确.由于您明确指定了模板参数,因此编译器将仅考虑函数模板来解析调用.

您的重载不是模板,非模板不接受模板参数.因此,编译器不会考虑它.