今天在csdn论坛碰到个问题
#include
using namespace std;
template
void min(const type array[size])
{cout<<array[2];
cout<<endl;
cout<<"the size of it:"<<size;
}
void main( )
{int a[]={1,3,4,5,6,7,9};
min(a);
}
这个程序在VC6中有错误,由于min(a)中size不能推演出来。
这个模板函数是min(const type array[size]),这个参数写好一点其实是:const type*array。min(a)实例化的时候,在模板推演中用了两个转换,一个是左值转换,一个是限定修饰符转换。从 int a[] à int *a à const int *a 。显然,参数传递的是仅是指针,这样是无法知道数组的大小的。
有两种方法解决:
1.用显式模板实参
min (a);
2. 改写模板函数声明
1) void min(const type *array, int size)
实例化: min(a,7);
2) void min(type (&array)[size]) // 这里不能写const type (&array)[size],因为这个与实参int (a)[] 不是同一类型,无法匹配。
实例化: min(a)
但我发现2)虽然符合标准(用gcc可以编译通过),但不能被VC6编译通过,有一个错误:
error C2265: ' ' : reference to a zero-sized array is illegal
这个有点费解。 越来越发现VC6真的不怎么符合C++标准,有点失望。然而庆幸的是,在VC7中可以无错编译 :)
2004-8-21