Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con remove_if

Estas en el tema de Problema con remove_if en el foro de C/C++ en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original Numero :: Numero ( const Cadena & numero ) throw ( Numero :: Incorrecto ) {   char * ...
  #1 (permalink)  
Antiguo 14/04/2014, 08:48
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 meses
Puntos: 0
Problema con remove_if

Código C++:
Ver original
  1. Numero::Numero (const Cadena& numero) throw (Numero::Incorrecto) {
  2.   char* num_nuevo = new char [numero.longitud() + 1];
  3.   strcpy (num_nuevo, numero.c_str());
  4.  
  5.   struct EsBlanco {
  6.     bool operator() (char c) const { return isspace(c); }
  7.   };
  8.  
  9.   struct EsDigito : unary_function<char,bool> {
  10.     bool operator() (char c) const { return isdigit(c); }
  11.   };
  12.  
  13.   char* final_nuevo = remove_if(num_nuevo, num_nuevo + strlen(num_nuevo), EsBlanco());
  14.   *final_nuevo = '\0';
  15.  
  16.   char* alfabetico = find_if (num_nuevo,final_nuevo,not1(EsDigito()));
  17.   if (*alfabetico != '\0')
  18.   throw(Incorrecto(DIGITOS));
  19.   if (strlen(num_nuevo) < LongitudMinima || strlen(num_nuevo) > LongitudMaxima)
  20.     throw(Incorrecto(LONGITUD));
  21.   if (!numeroValido(num_nuevo))
  22.     throw(Incorrecto(NO_VALIDO));
  23.   numero_ = num_nuevo;
  24. }

Recibo el siguiente error al compilar:

tarjeta.cpp: En el constructor ‘Numero::Numero(const Cadena&)’:
tarjeta.cpp:27:85: error: no hay una función coincidente para la llamada a ‘remove_if(char*&, char*, Numero::Numero(const Cadena&)::EsBlanco)’
tarjeta.cpp:27:85: nota: el candidato es:
/usr/include/c++/4.6/bits/stl_algo.h:1131:5: nota: template<class _FIter, class _Predicate> _FIter std::remove_if(_FIter, _FIter, _Predicate)
tarjeta.cpp:30:68: error: no hay una función coincidente para la llamada a ‘not1(Numero::Numero(const Cadena&)::EsDigito)’
tarjeta.cpp:30:68: nota: el candidato es:
/usr/include/c++/4.6/bits/stl_function.h:370:5: nota: template<class _Predicate> std::unary_negate<_Predicate> std::not1(const _Predicate&)
make: *** [tarjeta.o] Error 1
  #2 (permalink)  
Antiguo 14/04/2014, 13:40
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con remove_if

EsBlanco() y EsDigito() son invocacion de metodos.

Instancia un objeto de cada tipo, luego usa el objeto en la invocacion de remove_if
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 14/04/2014, 13:58
 
Fecha de Ingreso: octubre-2012
Mensajes: 37
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problema con remove_if

Código C++:
Ver original
  1. Numero::Numero (const Cadena& numero) throw (Numero::Incorrecto) {
  2.   char* num_nuevo = new char [numero.longitud() + 1];
  3.   strcpy (num_nuevo, numero.c_str());
  4.  
  5.   struct EsBlanco {
  6.     bool operator() (char c) const { return isspace(c); }
  7.   };
  8.  
  9.   struct EsDigito : unary_function<char,bool> {
  10.     bool operator() (char c) const { return isdigit(c); }
  11.   };
  12.   EsDigito digito;
  13.   EsBlanco blanco;
  14.   char* final_nuevo = remove_if(num_nuevo, num_nuevo + strlen(num_nuevo), blanco);
  15.   *final_nuevo = '\0';
  16.  
  17.   char* alfabetico = find_if (num_nuevo,final_nuevo,not1(digito));
  18.   if (*alfabetico != '\0')
  19.   throw(Incorrecto(DIGITOS));
  20.   if (strlen(num_nuevo) < LongitudMinima || strlen(num_nuevo) > LongitudMaxima)
  21.     throw(Incorrecto(LONGITUD));
  22.   if (!numeroValido(num_nuevo))
  23.     throw(Incorrecto(NO_VALIDO));
  24.   numero_ = num_nuevo;
  25. }


Me sigue dando el mismo fallo
  #4 (permalink)  
Antiguo 14/04/2014, 14:31
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con remove_if

struct EsBlanco y struct EsDigito tienen que definirse fuera de la clase, o en la definicion de la clase, no en la implementacion del constructor.
__________________
Visita mi perfil en LinkedIn

Etiquetas: numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:23.