可以在模板函数与C ++模板缺少参数来调用?(Can a template function be

2019-07-29 17:04发布

这是一个面试问题,它已经完成。

哪条线有错误?

  #include<iostream>
  template<class T> void foo(T op1, T op2)
  {
      std::cout << "op1=" << op1 << std::endl;
      std::cout << "op2=" << op2 << std::endl;
  }

  template<class T>
  struct sum
  {
      static void foo(T op1, T op2)
      {
              std::cout << "sum=" << op2 << std::endl ;
      }
  };

  int main()
  {
      foo(1,3);  // line1
      foo(1,3.2);  // line2
      foo<int>(1,3);  // line3
      foo<int>(1, '3') ; // line 4
      sum::foo(1,2) ; // line 5  , 

      return 0;
  }

2号线有错误,因为模板参数不匹配的定义。 5号线有错误,因为模板参数丢失。

不过,1号线是不是一个错误,我不知道为什么,是不是也错过模板参数?

谢谢 !

Answer 1:

这就是所谓的类型deducition。

在通过线路1的类型T可以推断,因为参数op1op2int ,使得T一个int

而在2号线,你都传递一个int和一个双,而函数接受两个参数T ,编译器不知道是否T应该是一个doubleint

因为你指定3号线是罚款int专业化,并通过int所公(使专业化的冗余,但完全OK)秒。

因为你声明4号线是OK T是一个int,然后铸造char的值'3'到其数字int值。

5号线是一个错误,因为你所访问从模板结构它在获取其类型的函数,和类型推演仅适用于功能。



Answer 2:

当我们用一个函数模板时,编译器推断哪个模板参数(S)绑定到模板参数(S)。 一旦编译器确定实际的模板参数(S),它实例为我们的函数的一个实例。 从本质上讲,编译器计算出到位每种类型参数的使用何种类型。 所以,如果op1op2具有相同类型的模板参数(S)可以省略(这就是为什么线#2的原因错误)。

C ++底漆



文章来源: Can a template function be called with missing template parameters in C++ ?