Я пытаюсь перегрузить функцию 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 с двумя входами? Я неправильно вызываю функцию?
Спасибо!
Вам не нужно говорить, что итераторы должны быть членами некоторых типов. 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;
}
Во-первых, я не думаю, что вы хотите сделать это. Не все последовательности имеют
основной контейнер. (Думать о istream_iterator
с, например.) И
что еще более важно, вы явно позволяете (и даже поощряете)
начинать и заканчивать итераторы из разных контейнеров; есть нет дело
где вы могли бы легально использовать эту функцию, где T1
а также T2
иметь
Различные типы. Шаблон должен иметь один параметр, который
должен быть итератором; и условно, ограничения на
итератор должен быть выражен в имени параметра, например,
InputIterator
(случай здесь), ForwardIterator
, так далее.
Что касается того, почему ваш код не компилируется:
В большинстве случаев используются типы, шаблоны и нетиповые значения
составить P участвовать в выводе аргумента шаблона. То есть они
может использоваться для определения значения аргумента шаблона, а
определенное таким образом значение должно соответствовать определенным значениям
в другом месте. Однако в определенных контекстах значение не
участвовать в выводе типа, но вместо этого использует значения шаблона
аргументы, которые были либо выведены в другом месте, либо явно указаны.
Если параметр шаблона используется только в не выводимых контекстах и является
явно не указано, вывод аргумента шаблона завершается неудачно.Неведуемые контексты:
— Спецификатор вложенного имени типа, который был указан с помощью
[…]
Квалифицированный-идентификатор.
(Из §14.8.2.5 / 4,5.)
Вызовите метод, как это ..
Sum<list<double>,list<double> >(test_list.begin(), test_list.begin());