C ++模板函数特化错误

时间:2015-08-29 22:05:18

标签: c++ templates specialization

我是使用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>          ]

我很感激,如果有人能给我一个提示! 感谢

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?您可以将初始化语句留空。