2015-08-29 3 views
1

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

#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>   ] 

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

+0

Что-то не так с вашими петлями. – erip

+0

post fix increment operator не определен для std :: map ваш тип параметра должен быть std :: map :: iterator для приращения для работы. –

+0

Да. Я только это заметил. Спасибо за ваш комментарий. – Hamed

ответ

1

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

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 как вы входите в цикл? Вы можете оставить инструкцию инициализации пустой.

+0

Спасибо! Это действительно помогает. Еще один вопрос, когда я пытаюсь отделить реализацию, создав файл cpp, я получаю ошибку компоновщика! Он отлично работает, когда я включаю все в hpp, но как только я создаю cpp, я получаю ошибку ссылки (очевидно, в этом случае я включаю файл cpp в основную программу). У вас есть идея? Еще раз спасибо. – Hamed

+0

[Шаблоны могут быть реализованы только в заголовочном файле] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). – LogicStuff

+0

Спасибо, миллион! – Hamed