C++ 模板的非类型形参问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 16:12:29
最近在看C++ primer 里面介绍函数模板时介绍了非类型模板形参;下面是实例程序(函数声明)
template<class T,size_t N>
void array_init(T (&parm)[N])
{
for(size_t i=0;i!=N;++i)
parm[i]=0;
}
int main()
{
int x[42];
array_init(x);
return 0;
}

编译时报错啊,error C2265: '<Unknown>' : reference to a zero-sized array is illegal//这是,函数首部那行报的错
error C2784: 'void __cdecl array_init(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'int [42]'//这是函数调用那行出的错
高手帮忙啊!!!!!!!!

哥们儿,你用的是VC6吧,楼上那位用的是VC2008。C++ Primer书成于1997年,当前ISO C++标准是98年的,而VC6是98年的产品,模板是比较靠后加入的特性,所以C++的很多特性,当时MS没有时间去实现。
C++ Primer书中的很多代码在VC6下都不能通过,还有,像export分离模式编译模板,好像只有EDG这一种编译器支持,标准通过前,EDG觉得这个很难实现,于是全力反对。但为了使标准通过,于是他们不反对了。结果标准通过后,大家发现这个功能实现实在是太困难了,都放弃了。只有EDG这个反对最强烈的小组,用了3人年的时间给实现了这个功能(同样3人年,EDG连Java的整个环境都写完了)。Bjarne Stroustrup说,这叫专业!因为它需要编译滞后,网上有分析,有机会可以看看。支持你学这本书,我也在看。QQ:200027

1>------ 已启动生成: 项目: baidu, 配置: Debug Win32 ------
1>正在编译...
1>main.cpp
1>正在链接...
1>正在嵌入清单...
1>生成日志保存在“file://e:\Documents\Visual Studio 2008\Projects\baidu\Debug\BuildLog.htm”
1>baidu - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

我就没错。

#include <iostream>

using namespace std;
template<class T,size_t N>
void array_init(T (&parm)[N])
{
for(size_t i=0;i!=N;++i)
parm[i]=0;
}
int main()
{
int x[42];