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

C++ 为什么编译器不解析对模板函数的调用?,c++,templates,overload-resolution,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<

在下面的程序中,为什么编译器为调用
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);
}
#包括
模板
void printMax(A、A、b)
{
A c=A>b?A:b;

std::cout为了让编译器从传递给函数模板的参数推断模板参数
A
,两个参数
A
b
必须具有相同的类型

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

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

printMax(1.0, 14.45);
或者通过显式指定模板参数:

printMax<double>(1, 14.45);

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

调用函数,以便编译器推断模板参数r
A
从传递到函数模板的参数中,两个参数、
A
b
必须具有相同的类型

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

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

printMax(1.0, 14.45);
或者通过显式指定模板参数:

printMax<double>(1, 14.45);

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

调用该函数。以下代码基于James的答案构建。您不会我已经去掉了条件表达式:我这样做是因为该表达式的result子句必须具有相同的类型,这对A和B施加了额外的限制


在这个版本的代码中,对A和B的唯一要求是有一个操作符下面的代码基于James的答案。你会注意到我去掉了条件表达式:我这样做是因为该表达式的result子句必须具有相同的类型,这对A和B施加了额外的限制


在这个版本的代码中,对A和B的唯一要求是有一个运算符。另一个修复方法是获取两个模板参数,在函数内执行转换。另一个修复方法是获取两个模板参数,在函数内执行转换。