unary_negate

Iniciado por DvNe, 7 Abril 2014, 22:53 PM

0 Miembros y 1 Visitante están viendo este tema.

DvNe

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é


 


Eternal Idol

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..
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

DvNe

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) ?

Eternal Idol

Si, ahora te falta arreglar la parte del unary_negate propiamente dicho (EsAlfabetico).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

DvNe

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'

Eternal Idol

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).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

DvNe

Ya lo resolví tenias razón muchas gracias

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón