2010-08-28 80 views
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); 
} 

回答

6

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

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

printMax(1.0, 14.45); 

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

printMax<double>(1, 14.45); 

的原因,调用非模板函数

您可以通过这两个参数具有相同类型的解决这个问题可以称得上是编译器不需要推导出参数的类型:它知道参数的类型,因为你说的话,他们在函数声明:

void printMaxInts(int a, int b) 

ab都是int类型。当你经过一个double作为参数传递给该功能,double -> int标准转换的参数执行,并且调用该函数时用所得int

+3

另一个解决方法是取两个模板参数,在函数中执行转换。 – Potatoswatter 2010-08-28 19:00:01

1

以下代码建立在James的答案上。你会发现,我已经取出的条件表达式:我已经这样做了,因为结果子句该表达式必须具有相同的类型,规定了A和B

上唯一的要求附加限制A和B在这个版本的代码的是,有操作者<(),其相关的它们(或一个可转化为其他的),以及必要的操作者< <()函数存在。

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