模板构造函数和typedef迭代器

时间:2012-03-04 17:11:10

标签: c++ templates typedef

我想定义一个构造函数,使用任何具有begin,end,operator ++的构造函数。 换句话说,我想得到这种行为(评论,工作代码):

/*Polyn(std::vector<double> &a) : CalcDerivative(0) , CalcIntegral(0) {
    for(std::vector<double>::iterator i = a.begin();i < a.end();++i)
      params.push_back(*i);
    }*/

与其他迭代器。 (例如列表)。

template <typename T>
  Polyn(const T &a) : CalcDerivative(0) , CalcIntegral(0) {
  typename std::vector<T>::iterator iter;
  for(iter i = a.begin();i < a.end();++i) //LINEA 18!!
    params.push_back(*i);
  }

我得到的是这个编译错误:

polyn.h: In constructor ‘Polyn::Polyn(const T&)’:
polyn.h:18: error: expected ‘;’ before ‘i’

为什么呢?如何修复我的代码?

2 个答案:

答案 0 :(得分:2)

首先,函数的参数类型应为std::vector<T> const &而不是T const &。然后你应该使用const_iterator

typename std::vector<T>::const_iterator iter;

因为vector a是一个const对象。

如果将构造函数实现为:

,那就更好了
template <typename T>
Polyn(const std::vector<T> &a) 
  : params(a.begin(), a.end()), CalcDerivative(0) , CalcIntegral(0) 
{
}

即,在member-initialization-list本身初始化params

答案 1 :(得分:1)

除了Nawaz的回答,如果你想支持任何支持begin,end和forward迭代器的容器类型,你可能想要使用:

template <typename C>
Polyn(const C &a) 
  : params(a.begin(), a.end()), CalcDerivative(0) , CalcIntegral(0) 
{
}

这样它也适用于std::liststd::maps等等。或者,当支持C ++ 11时,您实际应该使用更通用的std::begin(a)std::end(a),因此它甚至可以用于普通数组或其他任何专门用于std::begin和{{{ 1}}。

另一个类似STL的选项是直接使用迭代器作为参数,但是你必须在客户端代码中手动执行开始/结束(当调用构造函数时):

std::end