Копирование контейнеров

430
29 октября 2017, 19:49
template<class In, class Out> void copy(In from, In too_far, Out to)
{
    *to = *from; //копируем элемент указуемый итератором
    ++to; // следующий выходной элемент
    ++from; //следующий входной элемент
}
char vc1[200];
char vc2[200];
void f1()
{
    copy(&vc1[0], &vc1[200], &vc2[0]);
}
std::complex<double> ac[200];
void g(std::vector<std::complex<double>> &vc, std::list<std::complex<double>> &lc )
{
    copy(&ac[0], &ac[200], lc.begin());
    copy(lc.begin(), lc.end(), vc.begin())
}

Код взят из книги и отредактирован для использования со стандартными контейнерами, вместо собственных классов. Ошибка:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0308   more than one instance of function template "copy" matches the argument list:   ClassesAndMore  c:\Users\Dima\Documents\Visual Studio 2017\Projects\ClassesAndMore\ClassesAndMore\Template.h    73  
Error (active)  E0308   more than one instance of function template "copy" matches the argument list:   ClassesAndMore  c:\Users\Dima\Documents\Visual Studio 2017\Projects\ClassesAndMore\ClassesAndMore\Template.h    72  

Со стандартной библиотекой работал очень мало.

Answer 1

Здесь срабатывает правило языка, называемое Argument Dependent Lookup (ADL) — поиск, зависимый от аргументов. Заключается оно в том, что при поиске функции рассматривается не только текущее пространство имён, но и пространство имён аргументов функции. В случаях когда типы аргументов находятся в std, т.е. для ac и lc, обнаруживается функция std::copy. Если нужно вызывать только вашу шаблонную функцию, можно явно указать глобальное пространство имен, т.е. вызывать так:

::copy(lc.begin(), lc.end(), vc.begin());

Еще должен сработать такой вариант:

(copy)(lc.begin(), lc.end(), vc.begin());
Answer 2

Функция copy перегруженна и компилятор не может выбрать какая реализация подходит лучше для аргументов передающихся в нее, ваша или copy из стандартной библиотеки. Решение – переименовать вашу copy, либо вовсе не перегружать ее.

READ ALSO
Перестали работать елементы после JQMIGRATE Wordpress

Перестали работать елементы после JQMIGRATE Wordpress

Всем приветНедавно на сайте перестали работать некоторые элементы - вот этот переключатель и гамбургер меню

400
Как вырезать такую линию c помощью css? [дубликат]

Как вырезать такую линию c помощью css? [дубликат]

На данный вопрос уже ответили:

460
Что написать и как двигаться дальше? [требует правки]

Что написать и как двигаться дальше? [требует правки]

Умею работать с: HTML5, CSS3, JavaScript(jQuery), AJAX, PHP, MySQL

360