の必要はありませんstd::copy
。また、イテレータのペアも必要ありません。
これを行うだけです:
vector<int> copy_vec(vec); //use the copy constructor!
そして、あなたは完了です!
あなたのコードに関して、それがエラーを出す理由は、最初のイテレータがであるためstd::copy
ですconst_iterator
が、2番目のイテレータはちょうどiterator
です。std::copy
両方とも同じタイプである必要がありますが、そうではありません。そのため、関数テンプレートであるテンプレート引数の推定は失敗します。
例でこれを理解するために、次の単純なコードを考えてみましょう。
template<typename T>
void f(T a, T b) {}
int main()
{
int a = 100;
char b = 'A';
f(a,b);
}
エラーが発生しています(ideoneを参照)。
prog.cpp:8: error: no matching function for call to ‘f(int&, char&)’
テンプレート引数の推定に依存しているため、コンパイルされません。関数テンプレートでは、最初のパラメーターと2番目のパラメーターのタイプはまったく同じですが、この関数を呼び出して()を最初の引数として、()を2番目の引数として渡すa
ためint
、b
異なるタイプの引数から一意にchar
推測することはできません。テンプレート引数の推論では、変換は考慮されないことに注意してください。T
ただし、テンプレート引数の推論に依存せず、代わりにテンプレート引数を明示的に指定すると、機能します(ideoneを参照)。
f<int>(a,b); //works!
関数の引数から推測する必要がないのでT
機能します!
同様に、のテンプレート引数を指定するとstd::copy
、コードでも機能します(ideoneを参照)。
std::copy<vector<int>::const_iterator>(i,vec.end(),back_inserter(copy_vec));
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^ explicitly provide template argument!
にiterator
変換できるため機能しますがconst_iterator
、にconst_iterator
変換できないためiterator
、次のエラーが発生します(ideoneを参照)。
std::copy<vector<int>::iterator>(i,vec.end(),back_inserter(copy_vec));
//^^^^^^^^^^^^^^^^^^^^^ non-const iterator!