1

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

哪一行有错误?

  #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 行不是错误,我不知道为什么,它不是也错过了模板参数吗?

谢谢 !

4

2 回答 2

5

这叫做类型推导。

在第 1 行,T可以推断出 的类型,因为参数和op1都是op2int使得.Tint

而在第 2 行,您同时传递了 int 和 double 而函数接受两个参数 as T,编译器不知道T应该是 adouble还是 an int

第 3 行很好,因为您指定了int专业化并同时传入int了 s(使专业化变得多余但完全可以)。

第 4 行是可以的,因为您声明T为 int,然后将char'3'转换为其数值int

第 5 行是一个错误,因为您正在访问一个从其所在的模板化结构中获取其类型的函数,而类型推导仅适用于函数。

于 2012-06-03T18:21:07.970 回答
0

当我们使用函数模板时,编译器会推断出要绑定到模板参数的模板参数一旦编译器确定了实际的模板参数,它就会为我们实例化一个函数实例。本质上,编译器会计算出使用什么类型来代替每个类型参数。因此,如果op1op2具有相同的类型,则可以省略模板参数(这就是第 #2 行导致错误的原因)。

来自C++ 入门

于 2012-06-04T11:17:46.157 回答