我是使用C ++模板的新手。 我需要为我的项目编写一个模板函数专门化。 它是一个简单的Sum函数,用于不同类型的输入,它计算两个迭代器之间的总和。原始函数是通用的,因此接受模板参数。模板专业化是为地图编写的。
#include <map>
#include <string>
template <typename T>
double Sum(T &it_beg, T &it_end) {
double sum_all = 0;
for(it_beg++; it_beg != it_end; it_beg++)
sum_all += *it_beg;
return sum_all;
};
template <>
double Sum(std::map<std::string, double> &it_beg, std::map<std::string, double> &it_end) {
double sum_all = 0;
for(it_beg++; it_beg != it_end; it_beg++)
sum_all += it_beg->second;
return sum_all;
};
当我尝试运行代码时,出现以下错误
...\sum.h(21): error C2676: binary '++' : 'std::map<_Kty,_Ty>' does not define this operator or a conversion to a type acceptable to the predefined operator
1> with
1> [
1> _Kty=std::string,
1> _Ty=double
1> ]
我很感激,如果有人能给我一个提示! 感谢
答案 0 :(得分:1)
你的函数签名应该是这样的(可能没有引用),所以你可以传入rvalues(迭代器很便宜,无论如何都要复制):
template <>
double Sum(std::map<std::string, double>::iterator it_beg,
std::map<std::string, double>::iterator it_end)
std::map
未定义operator++
,显然您的参数应为std::map::iterator
。
不要忘记从主模板函数参数中删除引用。
还有这个:
for(it_beg++; it_beg != it_end; it_beg++)
为什么在进入循环时递增it_beg
?您可以将初始化语句留空。