2016-12-01 58 views
0

我正在研究一个关于STL迭代器主题的问题,问题是:创建一个计算两个迭代器之和的Sum()函数。如何使用2迭代器计算求和函数map <string,double>

template<class T1, class T2 > 
double Sum<T1,T2>(map<T1,T2>& start, map<T1,T2>&end) 
{ 
    double sum = 0.0; 
    class map<T1,T2>::const_iterator i; 
    for (i = start; i != end; ++i) 
    { 
     sum += i->second; 
    } 
    return sum; 
} 
下面

是什么在我的主要():

map<string, double>::const_iterator map_StartIter =doubleMap.begin(); 
map<string, double>::const_iterator map_EndIter = doubleMap.end(); 
cout<<"(2 iterator) map Sum is "<< Sum(map_StartIter,map_EndIter) << endl; 

它抛出一个错误说法错误C2768: '点心':非法使用显式模板参数

出了什么问题?

回答

0

它应该是这个:如果你需要计算map <string, double>如你所说

template<class Iter > 
double Sum(Iter begin, Iter end) 
{ 
    double sum = 0; 
    for(Iter it = begin; it != end; ++it) 
     sum += it->second; 
    return sum; 
} 

请注意,您不必使用模板,你可以指定具体类型。

+0

可以肯定的是,这里不能推导出模板参数,所以'const_iterator's必须被明确地传进来。从一个可变映射开始传递'begin()'和'end()'将会失败。 –

+0

@SamVarshavchik你是对的,修复 – Slava

0

,你有特定的错误是,你不应该再次指定旁边的函数名在其声明中的模板参数:

template<class T1, class T2 > 
double Sum<T1,T2>(map<T1,T2>& start, map<T1,T2>&end) 
      ^~~~~~~ 

如果删除了高亮的部分,你会得到下一个的问题,这是你接受两个地图,而不是他们的迭代器:

template <class T1, class T2> 
double Sum(typename std::map<T1, T2>::const_iterator it, 
      typename std::map<T1, T2>::const_iterator end) 
{ 
    double sum = 0.0; 
    for (; it != end; ++it) 
    { 
     sum += it->second; 
    } 
    return sum; 
} 

注:内部变量是不必要的,因为你应该拷贝采取迭代器。

但是,这是非惯用代码:它非常冗长,并且阻止您通过std::unordered_mapstd::multimap(例如)传递迭代器。

相反,你可以简单地去一个水平,并使用迭代器类型本身作为一个模板参数:

template <typename I> 
double Sum(I it, I end) 
{ 
    double sum = 0.0; 
    for (; it != end; ++it) 
    { 
     sum += it->second; 
    } 
    return sum; 
} 

最后,Sum函数的结果类型不适合含int64_t的地图例。您可以改用迭代器去的类型的内value_type ...但它冗长,而不是使用一般decltype更简单:

template <typename I> 
auto Sum(I it, I end) -> decltype(it->second) 
{ 
    decltype(it->second) sum = 0; 
    for (; it != end; ++it) 
    { 
     sum += it->second; 
    } 
    return sum; 
} 

这样,当你添加整数,你会得到一个整数回。

相关问题