模板函数给出编译错误
可能重复:
std :: map :: const_iterator模板编译错误
这个想法是创建一个将容器类型作为Template参数的函数。 由于地图必须与其他顺序容器相比总结不同,因此我重载了地图的Sum函数,如下所示。
这是给我错误的功能:
template<typename T1, typename T2>
double Sum(const map<T1,T2>& input)
{
double finalSum=0;
map<T1,T2>::const_iterator iter_begin=input.begin();
map<T1,T2>::const_iterator iter_end=input.end();
for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
finalSum=finalSum+(iter_begin)->second;
}
return finalSum;
}
错误:
1> c: documents and settings keep my documents visual studio 2010 projects level 7 exercise 2 exercise 2 sum.h(34):error C4430:缺少类型说明符 - int假定。 注意:C ++不支持default-int
1> c: documents and settings keep my documents visual studio 2010 projects level 7 exercise 2 exercise 2 sum.h(34):error C2143:syntax error:missing','before'<'
这个函数是头文件的一部分。 我的头文件也包含函数定义。
几件事情:1.我尝试了typename,但我可能错了。 模板并不是我的强大领域。 随意指出是否需要typename。 内联关键字将有所帮助?
提前致谢。
编辑:发布整个标题file.With类型名称添加建议 。 但同样的错误。 Sum的第一个版本是没有typename编译好的。 第二个超载的地图给出了问题。
#ifndef SUM_H
#define SUM_H
template<typename T>
double Sum(const T& input)
{
double finalSum=0;
T::const_iterator iter_begin=input.begin();
T::const_iterator iter_end=input.end();
for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
finalSum=finalSum+(*iter_begin);
}
return finalSum;
}
//Mysterion !!!!!
template<typename T1, typename T2>
double Sum(const map<T1,T2>& input)
{
double finalSum=0;
typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
finalSum=finalSum+(iter_begin)->second;
}
return finalSum;
}
#endif
错误在于:double Sum(常量映射和输入)
这是你需要typename
s的地方:
typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
你猜对了 - 你需要typename
。 粗略地说,规则是如果你使用::
来引用一个类型,而::
依赖于模板参数,那么你必须使用typename
。 所以在你的情况下:
typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
你忘了#include <map>
,你也应该用std
限定词来限定它的名字,因为那是map
生命。
不要太担心typename
(尽管添加它们会很好),因为VC ++是宽松的(并且不符合),所以它不是主要错误。