几个C++ PRIMER上的函数模板问题。
1>
typedef int (& rai)[10];
template <class T >
T min ( T ( &arr)[10] );
int array[10]={0};
min ( array );
问题:a> 第一个typedef是声明 rai 为有十个 int 型元素的数组的引用吗?为什么是这样声明呢?总是习惯 typedef int I ; 之种形式的。
b> 模板函数的参数为数组的引用,实参应该给个数组吧?而我们传给它的是数组名,一个指针,如何解释呢?照我理解直接传个 array[10] 为何不可呢?
c> 顺便问一下,一个普通函数以数组的引用为开参,如何专给它实参呢?具体作何理解或解释?
2>
C++ PRIMER
P418。
template <class T1, class T2, class T3>
T1 sum ( T2, T3);
typedef unsigned int ui_type;
P419:
ui_type (*pf) (char , ui_type) = & sum < ui_type >;
问题:
为什么我不可能直接用:ui_type (*pf) (char , ui_type) = & sum ;
呢?因为我认为 (*pf)前面的 ui_type 说明了这个指针指向的函数的返回类型,所以编译器可以根据这个来推演出模板参数 T1 ,然后生成实例。
而不用 ∑ <ui_type> 用<ui_type>来显示模板参数化来指明 T1。不是吗?
3>
P412:
template <teypename Type, int size>
Type min (Type ( &r_array) [size]
{ }
int ia[ ] = { 10, 7 , 8, 9, 4 };
......................
#include <iostream>
int main ()
{
..............
int i = min ( ia );
..............
}
P414:
template <class Type, int size >
Type min (Type ( &r_array)[size] )
{ }
void f (int pval[9] )
{
// 错误: Type (&)[ ] != int *
int jval = min ( pval );
}
问题:
这两个例子不是一样的吗?为什么一个错误一个没有?
为什么它说 pval 是 int * 型,而不是 int 型数组类型。那 p412 的那个例子为什么不是一样的吗?怎么解释?
问题点数:50、回复次数:6Top
1 楼aflyinghorse()回复于 2003-09-06 23:42:31 得分 10
第二个问题,函数的返回类型是不参加模版参数推演的
所以要显示指定
第三个问题
C++中数组作为参数都被看作指向第一个元素的指针
例如:f(int a[]), f(int a[10])都被看作f(int *)
即指向第一个元素的指针,而数组名才是数组类型Top
2 楼njSeeWhy(北海鲲鹏)回复于 2003-09-07 13:38:42 得分 0
你是在回答问题还是在提问题?Top
3 楼njSeeWhy(北海鲲鹏)回复于 2003-09-07 13:41:07 得分 0
不好意思,看错了。Top
4 楼ppby2002(lovewolf)回复于 2003-09-10 10:14:19 得分 15
第一个问题:
typedef int (& rai)[10];
声明的是一个含有10个元素的整型数组引用,声明的一般形式是
T (& )[size]
其中size是引用数组的大小。
形参列表可以写为 fun(rai arrayname){...}
还记得函数指针的一般形式么?
T (* )(T1,T2,...)
typedef int(*PFV)(int,int);
则
int fun(int a , int b)
可以有
PFV fp=fun;
:)
不知道我说明白没有啊
Top
5 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-09-10 19:33:35 得分 10
那么
void fun(rai arrayname){...}
在 fun 中,arrayname 是否自行退化成 int* 了呢?
Top
6 楼sevecol(sevecol.blogone.net)回复于 2003-09-10 19:42:15 得分 15
数组名退化成指针适应函数的参数是有条件的
当函数的参数类型是引用的时候,这种退化不会发生.Top




