在下面的程序中,为什么编译器会为调用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);
}
答案 0 :(得分:6)
为了让编译器从传递给函数模板的参数中推导出模板参数A
,两个参数a
和b
必须具有相同的类型。
您的参数类型为int
和double
,因此编译器无法推断它应该为A
实际使用的类型。 A
应该int
还是double
?
您可以通过使两个参数具有相同的类型来解决此问题:
printMax(1.0, 14.45);
或明确指定模板参数:
printMax<double>(1, 14.45);
可以调用非模板函数的调用的原因是编译器不需要推导出参数的类型:它知道参数的类型,因为你在函数声明中说明了它们:
void printMaxInts(int a, int b)
a
和b
都属于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;
}
}