这是一个面试问题,已经完成。
哪条线有错误?
#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行不是错误,我不知道为什么,是不是也错过了模板参数?
谢谢!
答案 0 :(得分:5)
它被称为类型deducition。
在第1行,可以推断T
的类型,因为参数op1
和op2
都是int
,使T
成为int
}。
而在第2行,你传递一个int和一个double,而函数接受两个参数T
,编译器不知道T
是double
还是int
或int
。
第3行很好,因为您指定了int
专门化并传入了T
(使专业化变得多余但完全正常)。
第4行是正常的,因为您将char
声明为int,然后将'3'
int
值转换为其数字{{1}}值。
第5行是一个错误,因为您正在访问一个函数,该函数从其所在的模板化结构中获取其类型,并且类型推导仅适用于函数。
答案 1 :(得分:0)
当我们使用函数模板时,编译器会推断要绑定到模板参数的模板参数。一旦编译器确定了实际的模板参数,它就会为我们实例化一个函数实例。本质上,编译器会确定使用哪种类型代替每个类型参数。因此,如果op1
和op2
具有相同的类型,则可以省略模板参数(这就是第2行引起错误的原因)。
来自 C ++入门