2010-05-28 17 views
13

Tengo problemas con las plantillas y tipos dependientes: quejasProblemas con tipos dependientes en las plantillas

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); 
    } 
} 

Compilador, a partir de la ubicación se ha indicado anteriormente:

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' 

¿Qué estoy haciendo mal?

+1

En VS2017, ahora es C7510. –

Respuesta

27

Bueno, el aviso dice:

nombre del dependiente no es un tipo. prefijo con 'nombre de tipo' para indicar un tipo

El nombre dependiente (es decir, el iterator en std::set<result_t>::iterator) no es un tipo. Es necesario prefijar con typename para indicar un tipo:

typename std::set<result_t>::iterator 

lo tanto, su declaración debe ser:

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^

(y la definición debe coincidir con la declaración)

4

Es necesario un adicional Palabra clave typename en esta línea:

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

Cuestiones relacionadas