2010-05-28 4 views
13

У меня возникли проблемы с шаблонами и зависимых типов:Проблема с зависимыми типами в шаблонах

namespace Utils 
{ 
    void PrintLine(const string& line, int tabLevel = 0); 
    string getTabs(int tabLevel); 

    template<class result_t, class Predicate> 
    set<result_t> findAll_if(typename set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred) // warning C4346 
    { 
     set<result_t> result; 
     return findAll_if_rec(begin, end, pred, result); 
    } 
} 

namespace detail 
{ 
    template<class result_t, class Predicate> 
    set<result_t> findAll_if_rec(set<result_t>::iterator begin, set<result_t>::iterator end, Predicate pred, set<result_t> result) 
    { 
     typename set<result_t>::iterator nextResultElem = find_if(begin, end, pred); 
     if (nextResultElem == end) 
     { 
      return result; 
     } 
     result.add(*nextResultElem); 

     return findAll_if_rec(++nextResultElem, end, pred, result); 
    } 
} 

Compiler жалоб от места было отмечено выше:

warning C4346: 'std::set<result_t>::iterator' : dependent name is not a type. prefix with 'typename' to indicate a type 
error C2061: syntax error : identifier 'iterator' 

Что я делаю неправильно?

+1

В VS2017 это сейчас C7510. –

ответ

27

Ну, предупреждение говорит:

зависимое имя не является типом. Приставка с «TypeName», чтобы указать, предустановленный вариант

зависимого имя (то есть, iterator в std::set<result_t>::iterator) не является типом. Вам нужно добавить префикс, typename для указания типа:

typename std::set<result_t>::iterator 

Итак, ваше заявление должно быть:

template<class result_t, class Predicate> 
set<result_t> findAll_if(typename set<result_t>::iterator begin, typename set<result_t>::iterator end, Predicate pred) 
               note added typename^

(и это определение должно соответствовать декларации)

4

Вам необходимо дополнительное ключевое слово typename по этой строке:

set<result_t> findAll_if(typename set<result_t>::iterator begin,typenameset<result_t>::iterator end, Predicate pred) // warning C4346

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