我想定义一个构造函数,使用任何具有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’
为什么呢?如何修复我的代码?
答案 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::list
和std::maps
等等。或者,当支持C ++ 11时,您实际应该使用更通用的std::begin(a)
和std::end(a)
,因此它甚至可以用于普通数组或其他任何专门用于std::begin
和{{{ 1}}。
另一个类似STL的选项是直接使用迭代器作为参数,但是你必须在客户端代码中手动执行开始/结束(当调用构造函数时):
std::end