2012-03-04 91 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