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必须具有相同的类型。

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

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

printMax(1.0, 14.45);

或通过显式指定模板参数:

printMax<double>(1, 14.45);

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

void printMaxInts(int a, int b)

a和都是b类型int。当您将 adouble作为参数传递给此函数时,将对double -> int参数执行标准转换,并使用结果调用函数int

于 2010-08-28T18:04:35.050 回答
1

以下代码建立在詹姆斯的回答之上。你会注意到我去掉了条件表达式:我这样做是因为该表达式的结果子句必须具有相同的类型,这对 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 回答