2016-08-10 2 views
-4

Следующий код бросает две ошибки компилятора в VS 2013:Ошибка синтаксиса для идентификатора 'итератора'

  1. Определение функции шаблона бросает

    ошибка C2061: синтаксическая ошибка: идентификатор 'iterator'

  2. Специализация по этой функции шаблона бросков

    erro г C2912: явная специализация «double getFillIn<double,double>(fillInOptions,double,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,inputLoader *,va_list)» не является специализация шаблона функции

Может кто-нибудь, пожалуйста, объясните почему? Я уверен, что вторая ошибка - это только следствие первого, но я не понимаю, почему он не может понять, что идентификатор iterator.

#include <map> 

template <typename T> class table { 
}; 

template <typename S, typename T> 
void f(S s, std::map<S, table<T>*>::iterator it); 
+2

Try 'имяТипа карта *> :: iterator'. – songyuanyao

+0

Я ошибался, но 'template class lookupTable ;' перед тем, как полностью определить 'lookupTable' вас укусит. Off topic: случаи по умолчанию в коммутаторах ничего не возвращают. Хорошо для предупреждения о компиляторе и немного отвратительной отладки, если когда-либо пробирается недопустимый или новый 'opt'. – user4581301

ответ

1

Поскольку компилятор еще не знает типа std::map<S, table<T>*>, он еще не может знать, что std::map<S, table<T>*>::iterator типа (это может быть членом). Вы должны сказать ему, что это будет тип:

template <typename S, typename T> 
void f(S s, typename std::map<S, table<T>*>::iterator it); 
+0

Исправлены оба ошибки - большое вам спасибо! – GodLovesUGaius

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