Перегрузка функции, не удалось вывести аргумент шаблона

Я пытаюсь перегрузить функцию Sum, которая принимает начальный и конечный итератор [список или вектор] в качестве аргументов. Эта ошибка компилятора действительно смущает меня. Соответствующий код выглядит следующим образом:

template <typename T1, typename T2>
const double Sum(const typename T1::const_iterator& start_iter, const typename T2::const_iterator& end_iter)
{// overloaded function that calculates sum between two iterators
typename T1::const_iterator iterator_begin = start_iter;
typename T2::const_iterator iterator_end = end_iter;

double my_sum = 0;

for (iterator_begin; iterator_begin != iterator_end; iterator_begin++)
my_sum += *iterator_begin;

return my_sum;
}

int main()
{

list<double> test_list(10,5.1);
cout << Sum(test_list.begin(), test_list.end()); // compiler errors here

}

Я получаю следующие ошибки компилятора:

iterators.cpp (72): ошибка C2783: ‘const double Sum (const
T1 :: const_iterator &, const T2 :: const_iterator &) ‘: не смог вывести
аргумент шаблона для ‘T1’

iterators.cpp (72): ошибка C2783: ‘const double Sum (const
T1 :: const_iterator &, const T2 :: const_iterator &) ‘: не смог вывести
шаблонный аргумент для ‘T2’

iterators.cpp (72): ошибка C2780: ‘const double Sum (const
станд :: Карта &) ‘: ожидается 1 аргумент — 2 предоставлено

iterators.cpp (72): ошибка C2780: ‘const double Sum (const T) &) ‘:
ожидает 1 аргумента — 2 предоставлено

Как компилятор не распознает, что я пытаюсь вызвать функцию Sum с двумя входами? Я неправильно вызываю функцию?

Спасибо!

0

Решение

Вам не нужно говорить, что итераторы должны быть членами некоторых типов. T1 а также T2Просто создайте шаблон на самом типе итератора:

template <typename Iter>
const double Sum(Iter iterator_begin, Iter iterator_end)
{
double my_sum = 0;
for (; iterator_begin != iterator_end; ++iterator_end)
my_sum += *iterator_begin;
return my_sum;
}

int main()
{
std::list<double> test_list;
std::cout << Sum(test_list.begin(), test_list.end());
return 0;
}

также есть стандарт станд :: аккумулируют это делает это:

int main()
{
std::list<double> test_list;
std::cout << std::accumulate(test_list.begin(), test_list.end(), 0.0);
return 0;
}
5

Другие решения

Во-первых, я не думаю, что вы хотите сделать это. Не все последовательности имеют
основной контейнер. (Думать о istream_iteratorс, например.) И
что еще более важно, вы явно позволяете (и даже поощряете)
начинать и заканчивать итераторы из разных контейнеров; есть нет дело
где вы могли бы легально использовать эту функцию, где T1 а также T2 иметь
Различные типы. Шаблон должен иметь один параметр, который
должен быть итератором; и условно, ограничения на
итератор должен быть выражен в имени параметра, например,
InputIterator (случай здесь), ForwardIterator, так далее.

Что касается того, почему ваш код не компилируется:

В большинстве случаев используются типы, шаблоны и нетиповые значения
составить P участвовать в выводе аргумента шаблона. То есть они
может использоваться для определения значения аргумента шаблона, а
определенное таким образом значение должно соответствовать определенным значениям
в другом месте. Однако в определенных контекстах значение не
участвовать в выводе типа, но вместо этого использует значения шаблона
аргументы, которые были либо выведены в другом месте, либо явно указаны.
Если параметр шаблона используется только в не выводимых контекстах и ​​является
явно не указано, вывод аргумента шаблона завершается неудачно.

Неведуемые контексты:

— Спецификатор вложенного имени типа, который был указан с помощью
Квалифицированный-идентификатор.

[…]

(Из §14.8.2.5 / 4,5.)

4

Вызовите метод, как это ..

Sum<list<double>,list<double> >(test_list.begin(), test_list.begin());
2
По вопросам рекламы [email protected]