Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: DvNe en 7 Abril 2014, 22:53 PM

Título: unary_negate
Publicado por: DvNe en 7 Abril 2014, 22:53 PM
Buenas estoy escribiendo la siguiente funcion


Código (c++) [Seleccionar]

#include <iostream>
#include <cstring>
#include <functional>
#include <algorithm>

using namespace std;

class EsDigito {
public:
bool operator() (const char& c) const { return isdigit(c); }
};

int main() {
unary_negate<bool> EsAlfabetico (EsDigito);

char letras2[] = " 452485A56321";
inicio = letras;
fin = letras + sizeof(letras)/sizeof(char);

if (find_if(inicio,fin,EsAlfabetico()))

   cout << "Alfabetico" << endl;

  return 0;

}




Cuando compilo me sale el siguiente error:

prueba.cpp:35:39: error: faltan argumentos para la función 'std::unary_negate<bool> EsAlfabetico(EsDigito)'
prueba.cpp:30:22: nota: se declara aquí

Alguien me puede explicar el por qué


 

Título: Re: unary_negate
Publicado por: Eternal Idol en 7 Abril 2014, 23:12 PM
Con el siguiente ejemplo podes solucionar tus errores:
http://www.cplusplus.com/reference/functional/unary_negate/

Necesitas el argument_type, no tenes que usar llamada de funcion en el tercer parametro de find_if, tenes que usar un objeto para el unary_negate, etc..
Título: Re: unary_negate
Publicado por: DvNe en 7 Abril 2014, 23:31 PM
Entonces debería definir la clase como

class EsDigito {
public:
bool operator() (const char& c) const { return isdigit(c); }
typedef char argument_type;
};

y la llamada a la función sería find_if(inicio,fin,EsAlfabetico) ?
Título: Re: unary_negate
Publicado por: Eternal Idol en 7 Abril 2014, 23:33 PM
Si, ahora te falta arreglar la parte del unary_negate propiamente dicho (EsAlfabetico).
Título: Re: unary_negate
Publicado por: DvNe en 7 Abril 2014, 23:49 PM
Algo estoy haciendo mal porque ahora me sale este fallo:

In file included from /usr/include/c++/4.6/string:50:0,
                 from /usr/include/c++/4.6/bits/locale_classes.h:42,
                 from /usr/include/c++/4.6/bits/ios_base.h:43,
                 from /usr/include/c++/4.6/ios:43,
                 from /usr/include/c++/4.6/ostream:40,
                 from /usr/include/c++/4.6/iostream:40,
                 from prueba.cpp:1:
/usr/include/c++/4.6/bits/stl_function.h: En la instanciación de 'std::unary_negate<bool>':
prueba.cpp:36:38:   instanciado desde aquí
/usr/include/c++/4.6/bits/stl_function.h:352:11: error: 'bool' no es de tipo clase, struct o union
/usr/include/c++/4.6/bits/stl_function.h:363:7: error: 'bool' no es de tipo clase, struct o union
In file included from /usr/include/c++/4.6/algorithm:63:0,
                 from prueba.cpp:4:
/usr/include/c++/4.6/bits/stl_algo.h: En la función '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [con _RandomAccessIterator = char*, _Predicate = std::unary_negate<bool> (*)(EsDigito)]':
/usr/include/c++/4.6/bits/stl_algo.h:4427:41:   instanciado desde '_IIter std::find_if(_IIter, _IIter, _Predicate) [con _IIter = char*, _Predicate = std::unary_negate<bool> (*)(EsDigito)]'
prueba.cpp:36:38:   instanciado desde aquí
/usr/include/c++/4.6/bits/stl_algo.h:210:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:214:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:218:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:222:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:230:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:234:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
/usr/include/c++/4.6/bits/stl_algo.h:238:4: error: no se puede convertir '* __first' de 'char' a 'EsDigito'
Título: Re: unary_negate
Publicado por: Eternal Idol en 7 Abril 2014, 23:56 PM
Si, seguramente, si seguis el ejemplo de la pagina de referencia que te deje podes solucionarlo (yo ya lo hice). Tene en cuenta que:

std::unary_negate<IsOdd_class> IsEven_object (IsOdd_object);

En tu caso tiene que ser un objeto de tu clase como:
EsDigito esdigito;


PD. No tenemos tu progreso del codigo, solo podemos adivinar y el codigo original no era compilable por otros detalles tampoco (letras no existe por ejemplo).
Título: Re: unary_negate
Publicado por: DvNe en 8 Abril 2014, 17:46 PM
Ya lo resolví tenias razón muchas gracias
Título: Re: unary_negate
Publicado por: Eternal Idol en 8 Abril 2014, 18:59 PM
De nadas  ::)