现在的位置: 首页 > 综合 > 正文

函数模板问题

2013年01月28日 ⁄ 综合 ⁄ 共 869字 ⁄ 字号 评论关闭

今天在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中有错误,由于mina)中size不能推演出来。

 

这个模板函数是min(const type array[size]),这个参数写好一点其实是:const type*arraymin(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

抱歉!评论已关闭.