函数模板不会编译

时间:2013-12-16 03:09:26

标签: c++ templates

我只是在学习函数模板,我在下面创建的模板无法编译,我不确定是什么问题。我试图使一个int变量和一个双变量进入模板但我在调用函数时不断收到错误。错误是:

  

错误:没有匹配函数来调用'LargestFunction(int&,double&)'|

,代码如下:

 template <class Temp>
    Temp LargestFunction(Temp a, Temp b){
        if(a > b){
            return a;
        }
    else
        return b;
    }

    int main()
    {
        int NumOne = 30;
        double NumTwo = 52.252;
        cout << LargestFunction(NumOne,NumTwo);
        return 0;
    }

2 个答案:

答案 0 :(得分:2)

编译器不知道它应该推断出哪种类型。它应该是int还是double?在您的模板中,Temp指的是单一类型。您可以通过以下方式指定它:

LargestFunction<double>(NumOne,NumTwo);

或者您可以定义模板以采用Temp1Temp2类型。

答案 1 :(得分:2)

  1. 如果要支持不同类型,则需要使用不同的模板参数定义模板。

    template <typename Lhs, typename Rhs>
    typename std::common_type<Lhs, Rhs>::type max(const Lhs &lhs, const Rhs &rhs) {
      return lhs > rhs ? lhs : rhs;
    }
    

    通过这种方式,你可以传递不同的类型,你可以得到它们之间的常见类型。

  2. 如果您只想在函数中处理相同的类型,可以按原样保留模板。

    template <typename T>
    T max(const T &lhs, const T &rhs) {
        return lhs > rhs ? lhs : rhs;
    }
    

    然后,您需要投射其中一个参数,以便您拥有相同的类型。

    max(static_cast<double>(101), 4.2);
    

    或者,您也可以明确地专门化功能模板,但一般不鼓励这样做。

    max<double>(101, 4.2);