繁体   English   中英

为什么编译器无法将对调用的解析为模板函数?

[英]Why does the compiler not resolve this call to a template function?

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

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

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

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

printMax(1.0, 14.45);

或通过显式指定template参数:

printMax<double>(1, 14.45);

可以调用非模板函数的原因是,编译器无需推断出参数的类型:它知道参数的类型,因为您在函数声明中说了它们的含义:

void printMaxInts(int a, int b)

ab均为int类型。 当您将double作为参数传递给此函数时,对参数执行double -> int标准转换,并使用结果int调用该函数。

以下代码基于James的答案。 您会注意到我取出了条件表达式:之所以这样做,是因为该表达式的result子句必须具有相同的类型,这对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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM