Ошибка специализации функции шаблона С++

Я новичок в использовании шаблонов С++. Мне нужно написать специализацию функции шаблона для моего проекта. Это простая функция Sum для входных данных разных типов, которая вычисляет сумму между двумя итераторами. Исходная функция является универсальной и поэтому принимает аргумент шаблона. Специализация шаблона написана для Карт.

#include <map>
#include <string>

template <typename T>
double Sum(T &it_beg, T &it_end) {
    double sum_all = 0;

    for(it_beg++; it_beg != it_end; it_beg++)
        sum_all += *it_beg;

    return sum_all;
};

template <>
double Sum(std::map<std::string, double> &it_beg, std::map<std::string, double> &it_end) {
    double sum_all = 0;

    for(it_beg++; it_beg != it_end; it_beg++)
        sum_all += it_beg->second;

    return sum_all;
};

когда я пытаюсь запустить код, я получаю следующие ошибки

...\sum.h(21): error C2676: binary '++' : 'std::map<_Kty,_Ty>' does not define     this operator or a conversion to a type acceptable to the predefined operator
 1>          with
 1>          [
 1>              _Kty=std::string,
 1>              _Ty=double
 1>          ]

Я ценю, если кто-нибудь может дать мне подсказку! Благодарность


person Hamed    schedule 29.08.2015    source источник
comment
Что-то не так с вашими циклами for.   -  person erip    schedule 30.08.2015
comment
оператор инкремента после исправления не определен для std::map‹std::string, double› ваш тип параметра должен быть std::map‹std::string, double›::iterator для работы инкремента.   -  person Aneesh Dandime    schedule 30.08.2015
comment
Ага. Я только что это заметил. Спасибо за ваш комментарий.   -  person Hamed    schedule 30.08.2015


Ответы (1)


Ваша сигнатура функции должна выглядеть так (возможно, без ссылок), чтобы вы могли передавать rvalue (итераторы в любом случае копировать дешево):

template <>
double Sum(std::map<std::string, double>::iterator it_beg,
           std::map<std::string, double>::iterator it_end)

std::map не определяет operator++, ясно, что ваши аргументы предназначены для std::map::iterator.

Не забудьте также удалить ссылки из основных параметров функции шаблона.

Есть еще вот это:

for(it_beg++; it_beg != it_end; it_beg++)

Почему вы увеличиваете it_beg при входе в цикл? Вы можете оставить оператор инициализации пустым.

person LogicStuff    schedule 29.08.2015
comment
Спасибо ! Это действительно помогает. Еще один вопрос, когда я пытаюсь разделить реализацию, создав файл cpp, я получаю ошибку компоновщика!! Он отлично работает, когда я включаю все в hpp, но как только я создаю cpp, я получаю ошибку ссылки (очевидно, в этом случае я включаю файл cpp в основную программу). У вас есть идеи? Спасибо еще раз. - person Hamed; 30.08.2015
comment
Я прочитал этот пост и следовал их руководствам, но все же у меня проблема с отделением заголовка от реализации. Я создал еще один пост, так как он может быть интересен другим людям. stackoverflow.com/questions/32292476/ Спасибо. за вашу помощь в любом случае. - person Hamed; 30.08.2015
comment
@Hamed Вы не должны их разделять. Вот что я пытался тебе сказать. - person LogicStuff; 30.08.2015