template <class T> struct sum { static void foo(T op1 , T op2){ cout << op1 <<op2; } }; sum::foo(1,3);
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
其中template和class是关键字,class可以用typename 关键字代替,在这里 typename 和class没区别 ,<>括号中的参数叫 模板形参 ,模板形参和函数形参很相像, 模板形参不能为空 。 一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。 模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为
template <class T> void swap(T& a, T& b){},
该代码无法通过编译。原因是模板结构体sum的静态成员函数foo没有指定模板参数类型,而在调用foo函数时又没有指定模板参数类型,导致编译器无法确定模板参数类型。
为了使代码能够通过编译,可以按照以下方式修改:
cppCopy Codetemplate <class T> struct sum { static void foo(T op1 , T op2){ cout << op1 << op2; } }; // 调用时需要指定模板参数类型 sum<int>::foo(1,3);
在上述代码中,我们将调用foo函数时的模板参数类型指定为int,这样编译器就能够确定模板参数类型,从而通过编译。