2012-03-04 68 views
1

我想定义一个构造函数,它与任何具有begin,end,operator ++的构造函数一起工作。 换句话说,我想这种行为(评论说,工作代码):模板构造函数和typedef迭代器

/*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’ 

为什么呢?如何解决我的代码?

+4

你忘了“typedef”吗? – 2012-03-04 17:13:22

+2

另外请注意,你要么传递'std :: vector '或使用'typename T :: const_iterator'(实际上你需要'const_iterator'在这两个cass。 – 2012-03-04 17:19:21

+0

谢谢奥利查尔斯沃斯,我混淆了typename与typedef,对不起我的newbyness – jimifiki 2012-03-04 17:26:10

回答

1

除了谢里夫的答案,如果你想支持配套开始,结束和前向迭代任何容器类型,您可能需要使用:

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

这样,它也适用于std::list S和std::maps和什么。或者,当有C++ 11支持时,实际上应该使用更通用的std::begin(a)std::end(a),所以它甚至可以用于普通数组或其他专用于std::beginstd::end的其他任何东西。

另一种选择,这是一个比较STL状,将直接使用迭代器作为参数,但你必须做手工的开始/结束在客户端代码(调用构造函数时):

template <typename InputIterator> 
Polyn(const InputIterator &b, const InputIterator &e) 
    : params(b, e), CalcDerivative(0) , CalcIntegral(0) 
{ 
} 
2

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

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

由于矢量a是一个const对象。

更妙的是如果实现的构造函数:

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

也就是说,初始化成员初始化列表本身params

+0

感谢您的const_iterator 无论如何,我没有解决我所有的问题:我希望我的构造函数可以和向量一起使用,也可以和列表一起使用。 – jimifiki 2012-03-04 17:23:19

+0

@jimifiki:Ohh ..在这种情况下,只需用'T'代替'std :: vector ',保持初始化列表。工作 – Nawaz 2012-03-04 17:25:14

+0

由于类STL变体,我将检查Christian的答案作为我的解决方案,但是您的贡献对我也有帮助。我弄了一堆iter(我以为我正在定义一个新的“iter”类型)。很少有几行错误...... – jimifiki 2012-03-04 17:37:37