Нет необходимости в std::copy
, также вам не нужна пара итераторов.
Просто сделайте это:
vector<int> copy_vec(vec); //use the copy constructor!
И все готово!
Что касается вашего кода, почему он выдает ошибку, то это потому, что первый итератор для std::copy
является const_iterator
, а второй итератор - просто 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&)’
Он не компилируется, потому что мы полагаемся на вывод аргумента шаблона . Поскольку тип первого параметра и второго параметра равен точно , то же самое в шаблоне функции, но мы вызываем эту функцию, передавая 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!