1

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

代码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 回答
2

除了 Andy Prowl 的回答,请注意您可以使用模板专业化来完成您的工作:

template<>
int sumargs<int,char>(int a,char b)
{
  cout<<"\nThis works\n";
  return 1;
}
于 2013-06-13T17:11:50.323 回答
2

你应该使用

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

尝试特殊功能模板

于 2013-06-13T17:12:42.610 回答