2015-04-14 4 views
1

Я действительно не понимаю, почему этот кодСТД картохранилище и шаблонные функции

#include <map> 

template<typename T, typename U> std::ostream& operator<<(std::ostream& o, 
     const std::map<T,U>& input) 
{ 
    for (std::map<typename T,typename U>::iterator it=input.begin(); it!=input.end(); ++it) 
    { 
     o << it->first << " => " << it->second << '\n'; 
    } 
    return o; 
} 

возвращает эту ошибку компиляции:

error: wrong number of template arguments (1, should be 4) 
error: provided for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 

кто может мне помочь пожалуйста ??

ответ

4

Вы должны написать имя типа перед итератором декларации и использование const_iterator:

for (typename std::map<T,U>::const_iterator it=input.begin(); it!=input.end(); ++it

аргументе оператора < < требует константных объектов. Поэтому элементы карты должны быть const. Для этого используется const_iterator. имяТипа в декларации итератора требуется, чтобы указать, что следующее выражение является вложенным классом шаблона в зависимости от типов T и U.

Смотрите также этот вопрос: Making sense of arguments to a function template

+0

Или еще лучше, использовать ' auto': 'for (auto it = input.begin(); ...' или даже диапазон для цикла: 'for (auto & pair: input)' – Angew

Смежные вопросы