1)向模版传递 const类型
template <typename T > void fun( T &a)
{
int s =100;
T p = s;
p+= 1;
printf("%d \n",p);
}
int main()
{
int i = 100;
const int & p = i;
fun(p); //此时的函数式fun<const int> (const int &a);
}
VS2010中编译错误:
e:\source\mian\mian\mian.cpp(24): error C3892: 'p' : you cannot assign to a variable that is const
1> e:\source\mian\mian\mian.cpp(36) : see reference to function template instantiation 'void fun1<const int>(T &)' being compiled
1> with
1> [
1> T=const int
1> ]
2.模版为const 类型
template <typename T > void fun( const T &a)
{
int s =100;
T p = s;
p+= 1;
printf("%d \n",p);
}
int main()
{
int i = 100;
const int & p = i;
fun(p); //此时的函数式fun< int> (const int &a); T =int
}
编译通过;3)传递非const类型
template <typename T > void fun( const T &a)
{
int s =100;
T p = s;
p+= 1;
printf("%d \n",p);
}
int main()
{
int i = 100;
int & p = i;
fun(p); //此时的函数式fun< int> (const int &a); T =int
}
编译通过与第2中一样
小结:如果模版是非const T,实参的类型将如实传递得T,即 T = const int;
若果模版有const,实参类有无const ,模版中的T 都是非const类型,即T =int;
二、向模版传递数组
第四版C++ Prime 539 页说不能向模版传递 数组类型,因为不能转换成 int *类型;
不过在VS2010中可以,在 Linux G++也可,甚至可以用传递进来的类型之间,建立一个数组。
1)想引用传递数组
template <typename T > void fun( T &a)
{
printf("template %d\n",a[1]);
T s;//可以直接用这种类型建立个数组。
for(int i=0; i < 9; i++)
{
s[i] = i;
std::cout << s[i] << std::endl;
}
}
int _tmain(int argc, WCHAR* argv[])
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
fun(a);//此时的函数是fun<int [10]> ( int (&a) [10] ),即 T = int [10]
return 0;
}
2)数组类型的引用
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//int (&arry)[10] = a;数组类型的引用。。
int (&arry)[10] 可以声明为函数的形参,赋值的时候编译器会检查 数组大小是否与 自身的引用类型一致。
int a1[9] = {1,2,3,4,5,6,7,8,9,};
int (&arry1)[10] = a1; --------出错。
总结:虽然这些东西乱起八糟,只是给编译器看到东西,引用只不过简单的使用 指针。
无论什么类型的引用还是地址来表示,数组传递给引用只不过传递地址而已。
而用引用取数组内容简化了用指针取数组,这些由编译器来做。