【问题标题】:Why does the compiler not resolve this call to a template function?为什么编译器不将此调用解析为模板函数?
【发布时间】:2010-08-28 17:57:13
【问题描述】:

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

【问题讨论】:

    标签: c++ templates overload-resolution


    【解决方案1】:

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

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

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

    printMax(1.0, 14.45);
    

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

    printMax<double>(1, 14.45);
    

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

    void printMaxInts(int a, int b)
    

    ab 都是 int 类型。当您将double 作为参数传递给此函数时,会对该参数执行double -&gt; int 标准转换,并使用生成的int 调用该函数。

    【讨论】:

    • 另一种解决方法是采用两个模板参数,在函数内部执行转换。
    【解决方案2】:

    以下代码基于 James 的回答。你会注意到我去掉了条件表达式:我这样做是因为该表达式的结果子句必须具有相同的类型,这对 A 和 B 施加了额外的限制。

    在此版本的代码中,对 A 和 B 的唯一要求是有一个 operator

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2013-04-30
      相关资源
      最近更新 更多