在模板函数中使用const迭代器

时间:2014-08-12 13:25:49

标签: c++

我正在使用模板函数,以便它可以使用不同数值数据类型的列表或向量。但其中一个有问题:

// This function should take 2 iterators of a vector/list and sum the elements between them
template <typename T >
double Sum1(typename T::const_iterator start, typename T::const_iterator end){
    double sum = 0;
    // For g++, "typename is needed before T::const_iterator"
    for(typename T::const_iterator I = start; I <= end;I++){
        sum += *I;
    }
    return sum;
}

在main()中,它被称为:

vector<double> b;// and it is pushed by numbers 1-9 later

cout<<Sum1(b.begin(), b.end())<<endl;

但是编译器给了我错误

  

没有用于调用'Sum1(std :: vector :: iterator,&gt; std :: vector :: iterator)'的匹配函数

     

无法推断模板参数'T'

但是,此功能正常工作:

// T can be vector<int>, list<double>, etc. 
template <typename T >
double Sum(T& values){
    double sum = 0;
    // For g++, "typename is needed before T::const_iterator"
    for(typename T::const_iterator I = values.begin(); I != values.end();I++){
        sum += *I;
    }
    return sum;
}

知道为什么会这样吗?我应该如何修改第一个函数,以便它可以采用向量/列表的2个迭代器并计算它们之间的总和?

1 个答案:

答案 0 :(得分:4)

而不是对容器类型进行模板化,而是在迭代器上进行模板化。并且不要将用户限制为const_iterator - 任何迭代器应该做的是你实际上没有通过迭代器修改内容:

template <typename Iter> double Sum1(Iter start, Iter end)

通过执行此操作,您还可以使用任何可解除引用且可递增的类型 - 例如简单指针。