2012-03-04 5 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"を忘れましたか? –

+2

また、 'std :: vector 'を渡すか、 'typename T :: const_iterator'を使用することに注意してください(実際には両方のcassで' const_iterator'が必要です)。 –

+0

Thanks Oli Charlesworth、typedefでtypenameを混乱させました。私のnewbyness – jimifiki

答えて

1

作業を開始、終了と前方イテレータをサポートする任意のコンテナタイプをサポートする場合ナワズの答えに加えて、使用したいことがあります。

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::beginstd::endに特化したものでも機能します。 (コンストラクタを呼び出すときに)もう少しSTLのようである

別のオプションは、直接引数としてイテレータを使用することですが、その後、あなたは、クライアントコードで手動で開始/終了を行う必要があります:

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

まず、関数のパラメータタイプはT const &ではなくstd::vector<T> const &である必要があります。ベクトルaがconstオブジェクトであるため

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

:そして、あなたはconst_iteratorを使用する必要があります。メンバー初期化リスト自体にparamsを初期化し、ある

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

:あなたにコンストラクタを実装する場合

さらに良いです。

+0

const_iteratorに感謝します。 :私のコンストラクタがベクトルだけでなくリストを使って動作するようにしたい。 – jimifiki

+0

@jimifiki:Ohh ..その場合、 'std :: vector 'を 'T'と置き換えて、初期化リストをそのままにしておきます。仕事。 – Nawaz

+0

私はSTLのような変種のために私の解決策としてクリスチャンの答えをチェックするつもりですが、あなたの貢献私のためにも助けてくれました。私はiterで混乱を起こしました(私は新しい "iter"タイプを定義していると思いました)。数行で多くの間違いがあります... – jimifiki

関連する問題