一个C++问题,求解
函数模板min()的函数参数是一个引用它指向了一个Type 类型的数组
template <class Type, int size>
Type min( Type (&r_array)[size] ) { /* ... */ }
为了匹配函数参数函数实参必须也是一个表示数组类型的左值下面的调用是个错误
因为pval 是int*类型而不是int 数组类型的左值
void f( int pval[9] )
{
int jval = min( pval );
}
上面是C++ primer上的一段内容,这里说pval 是int*类型而不是int 数组类型的左值,int jval = min( pval )是非法的。请看下面一段代码:
template <typename Type, int size>
Type min( Type (&r_array)[size] )
{
Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;
}
int ia[] = { 10, 7, 14, 3, 25 };
double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };
#include <iostream>
int main()
{
int i = min( ia );
cout << "!!ok: integer min() worked\n";
double d = min( da );
cout << "!!ok: double min() worked\n";
return 0;
}
上面的代码也是C++ primer上的,这里的int i = min( ia );和double d = min( da );ia和da也是int*类型为什么却是合法的?而上面的int jval = min( pval );却是非法的,求解释,谢谢!
[解决办法]
上面的f函数,相当于传递了一个整数值。取其地址而已。
它识别的只是一个整数。
[解决办法]
第二个例子中 ia 和 da 都不是指针类型,而是数组类型。
[解决办法]
函数模板指定了怎样根据一组或更多实际类型或值构造出独立的函数 这个构造过程被
称为模板实例化 template instantiation 这个过程是隐式发生的 它可以被看作是函数模
板调用或取函数模板的地址的副作用 例如 在下面的程序中 min()被实例化两次 一次是
针对5 个int 的数组类型 另一次是针对6 个double 的数组类型
// 函数模板 min() 的定义
// 有一个类型参数 Type 和一个非类型参数 size
//函数模板
template <typename Type, int size>
Type min( Type (&r_array)[size] )
{
Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;
}
// size 没有指定——ok
// size = 初始化表中的值的个数
int ia[] = { 10, 7, 14, 3, 25 };
double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };
#include <iostream>
int main()
{
// 为 5个 int的数组实例化 min()
// Type => int, size => 5
int i = min( ia );
if ( i != 3 )
cout << "??oops: integer min() failed\n";
else cout << "!!ok: integer min() worked\n";
// 为 6 个 double 的数组实例化 min()
// Type => double, size => 6
double d = min( da );
if ( d != 3.2 )
cout << "??oops: double min() failed\n";
else cout << "!!ok: double min() worked\n";
return 0;
}
//调用
int i = min( ia );
//被实例化为下面的min()的整型实例 这里Type 被int size 被5 取代
int min( int (&r_array)[5] )
{
int min_val = r_array[0];
for ( int ix = 1; ix < 5; ++ix )
if ( r_array[ix] < min_val )
min_val = r_array[ix];
return min_val;
}
// 类似地 调用
double d = min( da );
//也实例化了min()的实例 这里Type 被double size 被6 取代