为什么编译器不能解析对模板函数的调用?

时间:2010-08-28 17:57:13

标签: c++ templates overload-resolution

在下面的程序中,为什么编译器会为调用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);
}

2 个答案:

答案 0 :(得分:6)

为了让编译器从传递给函数模板的参数中推导出模板参数A,两个参数ab必须具有相同的类型。

您的参数类型为intdouble,因此编译器无法推断它应该为A实际使用的类型。 A应该int还是double

您可以通过使两个参数具有相同的类型来解决此问题:

printMax(1.0, 14.45);

或明确指定模板参数:

printMax<double>(1, 14.45);

可以调用非模板函数的调用的原因是编译器不需要推导出参数的类型:它知道参数的类型,因为你在函数声明中说明了它们:

void printMaxInts(int a, int b)

ab都属于int类型。将double作为参数传递给此函数时,将对参数执行double -> int标准转换,并使用生成的int调用函数。

答案 1 :(得分:1)

以下代码建立在James的答案之上。您会注意到我已经取出条件表达式:我已经这样做了,因为该表达式的结果子句必须具有相同的类型,这对A和B施加了额外的限制。

在这个版本的代码中对A和B的唯一要求是有一个与它们相关的运算符&lt;()(或者一个可以转换为另一个),并且存在必需的运算符&lt;&lt;()函数

template<typename A, typename B>
void printMax(A a, B b)
{    
    if (a < b) 
    {
        cout << b;
    }
    else 
    {
        cout << a;
    }
}