C++ 在C+;中是否可以使用缺少的模板参数调用模板函数+?

C++ 在C+;中是否可以使用缺少的模板参数调用模板函数+?,c++,class,templates,function-templates,C++,Class,Templates,Function Templates,这是一个面试问题,已经完成了 哪一行有错误 #include<iostream> template<class T> void foo(T op1, T op2) { std::cout << "op1=" << op1 << std::endl; std::cout << "op2=" << op2 << std::endl; } template<

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

哪一行有错误

  #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;
  }
#包括
模板void foo(T op1,T op2)
{

这叫做类型推断

在第1行,可以推断
T
的类型,因为参数
op1
op2
都是
int
,使得
T
成为
int

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

第3行很好,因为您指定了
int
专门化,并将
int
s也传入(使专门化变得冗余但完全正常)

第4行没有问题,因为您将
T
声明为int,然后将
'3'
char
值强制转换为其数值
int


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

它被称为类型推断

在第1行,可以推断
T
的类型,因为参数
op1
op2
都是
int
,使得
T
成为
int

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

第3行很好,因为您指定了
int
专门化,并将
int
s也传入(使专门化变得冗余但完全正常)

第4行没有问题,因为您将
T
声明为int,然后将
'3'
char
值强制转换为其数值
int


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

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


从C++引物< < /P> < P>当我们使用函数模板时,编译器推断什么“强”模板参数(s)<强>绑定到模板参数(一次)。,它为我们实例化了函数的一个实例。本质上,编译器计算出用什么类型来代替每个类型参数。因此,如果

op1
op2
具有相同的类型,则可以省略模板参数(这就是第2行导致错误的原因)


<>从C++引物[< /p>(1)C++ ]不了解ASCII。(2)类模板没有类型推导,它不仅“不工作”。“C++是的,没错。我已经澄清了我的回答。谢谢。@ KonradRudolph和Mahmoud Al Qudsi,我仍然困惑为什么1行没有错误。C++支持类型推导吗?谢谢!@ USE100228 8从答案中不清楚。是的!C++在可能的时候使用类型推断,也就是说函数模板一样。第1行。这非常方便,因为它允许大量函数重载。(1)C++不知道ASCII。(2)类模板没有类型推导。它不仅“不工作”。“C++是的,没错。我已经澄清了我的回答。谢谢。@ KonradRudolph和Mahmoud Al Qudsi,我仍然困惑为什么1行没有错误。C++支持类型推导吗?谢谢!@ USE100228 8从答案中不清楚。是的!C++在可能的时候使用类型推断,也就是说函数模板一样。这非常方便,因为它允许大量函数重载。