这个想法是创建一个将容器类型作为模板参数的函数。由于与其他顺序容器相比,地图必须以不同的方式求和,我重载了地图的 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):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数
1>c:\documents and settings\keep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34): error C2143: 语法错误: ',' before '<'
这个函数是头文件的一部分。我的头文件也包含函数定义。
几件事: 1. 我尝试使用 typename 但我可能错了。模板还不是我的强项。如果某处需要类型名,请随时指出。内联关键字会有帮助吗?
- 相同的代码在我的 Guide 机器上编译得很好。我的是 VC++ 2010 Express SP1。我不知道他的 VC++ 版本是什么。
提前致谢。
编辑:发布整个头文件。按照建议添加类型名。但同样的错误。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(const map& input)