expected `;' before ‘iter’

本文介绍了一个在GCC编译器中遇到的模板错误,并提供了详细的修正方法。该错误源于模板内部引用类型未明确声明,通过使用typename关键字解决了这一问题。

gcc版本:

root@sunshine-laptop:~/workspace/c++# gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3

代码如下:

template <typename elemType>
void display(const vector<elemType> &vec, ostream &os)
{
vector<elemType>::const_iterator iter=vec.begin();
vector<elemType>::const_iterator end_it=vec.end();

for( ; iter != end_it; ++iter)
os << *iter << ' ';
os << endl;
}

错误如下:

test.cpp: In function ‘void display(const std::vector<elemType, std::allocator<_CharT> >&,std::ostream&)’:
test.cpp:9: 错误: expected `;' before ‘iter’
test.cpp:10: 错误: expected `;' before ‘end_it’
test.cpp:12: 错误: ‘iter’在此作用域中尚未声明
test.cpp:12: 错误: ‘end_it’在此作用域中尚未声明

这是因为C++标准的规定,引用模板类型内部的type必须显示告诉编译器这是个type( iterator)而不是variable.默认情况下认为模板内部的成员为变量。
在GCC编译器中认为
vector<elemType>::const_iterator 不是一个type,
在VC或Intel Compiler中不会出现这样的问题。
因此改为:

代码:

void display(const vector<elemType> &vec, ostream &os)
{
typename vector<elemType>::const_iterator iter=vec.begin();
typename vector<elemType>::const_iterator end_it=vec.end();

for( ; iter != end_it; ++iter)
os << *iter << ' ';
os << endl;
}

In file included from uilibTrafficTest.c:14:0: uilibTrafficTest.c: In function 'trafficTestGetEthernet': ../../../../../../src/platform/include/midware/tpConfig.h:111:34: error: expected ';' before 'for' #define TPCONFIG_ITER_FV(_pIter) for (int _IterFlag = 0; _IterFlag ++ == 0 ? 1 : TPOBJ_TYPE_IS_FIELD(tpObjIterGetNextValType(_pIter)) ? tpObjIterNext(_pIter), 1 : 0;) ^ uilibTrafficTest.c:198:3: note: in expansion of macro 'TPCONFIG_ITER_FV' TPCONFIG_ITER_FV(&stGetInfo.iterName) ^ uilibTrafficTest.c:230:88: error: request for member 'packetIdx' in something not a structure or union printf(" %-12s%-12d%-12d%-12d%-12d%-12d%-12d%-12d\r\n", strPort, packetIdx, packetCfg.packetIdx, ^ uilibTrafficTest.c:231:12: error: request for member 'srcMac' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ uilibTrafficTest.c:231:30: error: request for member 'dstMac' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ uilibTrafficTest.c:231:48: error: request for member 'srcIp' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ uilibTrafficTest.c:231:65: error: request for member 'dstIp' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ uilibTrafficTest.c:231:82: error: request for member 'lenType' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ uilibTrafficTest.c:231:101: error: request for member 'vlan' in something not a structure or union packetCfg.srcMac, packetCfg.dstMac, packetCfg.srcIp, packetCfg.dstIp, packetCfg.lenType, packetCfg.vlan); ^ CMakeFiles/uilib.dir/build.make:1313: recipe for target 'CMakeFiles/uilib.dir/uilibTrafficTest.c.o' failed make[4]: *** [CMakeFiles/uilib.dir/uilibTrafficTest.c.o] Error 1 make[4]: *** Waiting for unfinished jobs.... CMakeFiles/Makefile2:107: recipe for target 'CMakeFiles/uilib.dir/all' failed make[3]: *** [CMakeFiles/uilib.dir/all] Error 2 Makefile:132: recipe for target 'all' failed make[2]: *** [all] Error 2 package/tplink/tplink-generic.mk:289: recipe for target '/project/fep_source_2/buildroot/build/ac5x_pro/build/tplink/uilib-1.0/.stamp_built' failed make[1]: *** [/project/fep_source_2/buildroot/build/ac5x_pro/build/tplink/uilib-1.0/.stamp_built] Error 2 Makefile:84: recipe for target '_all' failed make: *** [_all] Error 2 解释下该报错
最新发布
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值