Buenas estoy escribiendo la siguiente funcion
#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é
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..
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) ?
Si, ahora te falta arreglar la parte del unary_negate propiamente dicho (EsAlfabetico).
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'
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).
Ya lo resolví tenias razón muchas gracias
De nadas ::)