2

C ++でコンテナクラスを作成しました。イテレータからのコンストラクタを持っているので、はMyContainer<double> x(v.begin(), v.end())どこにvあるかを記述できますstd::vector<double>。c-arrayでも同じことができるようにしたいと思いますが、:

double array[3] =  {1., 2. , 3.};
MyContainer<double> x(array, array+3); // Doesn't work : no matching function for call to ‘MyContainer<double>::MyContainer(double [3], double*)’
MyContainer<double> x(array+0, array+3); // Work

問題の原因とその解決方法は何ですか?

どうもありがとうございます。

4

2 に答える 2

4

イテレータへの参照を受け入れず、値でそれらを取得します。配列への参照を渡そうとしています。失敗した式では、配列がポインターに減衰する必要があります。

おそらくあなたは持っています

template< typename Iter >
MyContainer( Iter const &first, Iter const &last );

しかし、あなたは必要です

template< typename Iter >
MyContainer( Iter first, Iter last );

イテレータは、値を渡すのに十分軽量である必要があります。すべての標準テンプレートはそうします。

配列はインクリメントできないため、イテレータとして使用できません。ストレージは固定されています。のような式で配列を使用するか、値arr + 0で関数に渡すと、配列は暗黙的に最初の要素へのポインターに変換されます。ただし、参照を渡す場合、その変換は行われません。

于 2012-07-30T11:57:31.820 に答える
3

の結果はarray+0ポインタですが、arrayそれ自体はポインタではなく、配列です。コンストラクターには、配列とポインターを受け取るオーバーロードがないため、コンパイルは失敗します。

配列から開始イテレータと終了イテレータを作成する問題に対処する慣用的な方法は、begin(...)andend(...)関数を使用することです。

MyContainer<double> x(std::begin(array), std::end(array));

オーバーロードは、配列の終わりがどこにあるかを把握するのに役立ち、配列の長さをポインターに追加する必要がなくなります。

于 2012-07-30T11:59:27.330 に答える