下列代码可以通过编译吗?如何修改使其通过编译?
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){},
当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中c和d是double类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。
所以应该改成这样了。有点define的味道哦。
template<class T> struct sum{
static void foo(T op1 , T op2){
cout << op1 <<op2;
}
};
sum<int>::foo(1,3);
static void foo(T op1 , T op2){
cout << op1 <<op2;
}
};
sum<int>::foo(1,3);
这道题的考点是类模板的static成员。首先说说
模板实例化,即类模板需要指定确定的类型,例如本题中sum<int> a或者sum<string> a等。
static成员函数可以由类名或者对象直接调用。在本题中,sum<int> a;a.foo(1,3)或者sum<int>::foo(1,3)。两种形式均可。