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++在可能的时候使用类型推断,也就是说函数模板一样。这非常方便,因为它允许大量函数重载。