boost :: phoenix :: error de clasificación

Estoy tratando de ordenar un vector a continuación usando la biblioteca boost :: phoenix. La clase Foo tiene una función miembro 'int getvalue ()'. El propósito es ordenar el vector usando el valor devuelto por 'getvalue ()'. Pero falta algo. Recibo un error del compilador como ':: second no es una clase o espacio de nombres'

      std::vector<std::pair<int, Foo> > fooVec;

      boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second::getvalue(), boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );

¿Alguien puede explicar esto? ¿Qué cambios necesito para que esto funcione?

Gracias.

PD: Sé que podría haber usado la función object / lambda o algo similar, pero quería probar boost :: phoenix.

preguntado el 08 de noviembre de 11 a las 14:11

No creo que esto ordene su vector. El primer parámetro tiene que ser el rango que se ordenará. Dado que crea una expresión de fénix con ella, su vector no cambiará. -

¿Podría ser tan amable de decirme la forma correcta de hacerlo? Gracias... -

Agregué una respuesta con un ejemplo de cómo usaría phoenix en este caso. Pero difiere de su enfoque ya que ya no puedo usar std :: less. Pero tal vez ayude. -

2 Respuestas

Como comenté, no creo que tu forma de crear un actor phoenix a partir de tu vector pueda usarse para ordenarlo, pero nunca usé los algoritmos de phoenix, así que no estoy seguro. Por supuesto, puede usar sort y crear un functor con phoenix para ordenarlo.
Así que sugeriría usar phoenix de esta manera.

boost::phoenix::sort(boost::phoenix::placeholders::arg1, boost::phoenix::placeholders::arg2)(fooVec, 
        boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg1)) < boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg2))
        );

respondido 08 nov., 11:19

usando boost :: phoenix :: sort; usando boost :: phoenix :: arg_names :: arg1; int matriz [] = {3,1,2}; std :: lista lista_prueba (matriz, matriz + 3); boost :: phoenix :: sort (arg1, std :: mayor ()) (lista_prueba); Este es el ejemplo que viene como referencia con la biblioteca boost :: phoenix. Lo estaba siguiendo. Sin embargo, gracias por tu respuesta. - polapts

@Pavan: Esto es exactamente lo que quiero decir. Pasan en el contenedor como primer argumento. Pasa en una expresión de fénix como el primer parámetro. Eso no clasificará su contenedor. - mkaes

Es solo lo que dice el mensaje de error. std::pair<int, Foo>::second es un miembro de datos, no una clase o espacio de nombres, por lo que no puede usar el operador :: en ella.

En lugar de second, puedes usar second_type, Que es un typedef para el tipo del segundo elemento del par:

boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );

respondido 08 nov., 11:19

Gracias por la respuesta, pero lamentablemente no funciona. Me sale el mismo error. error: 'getvalue' no es miembro de 'std :: pair :: second_type '- polapts

Esto significa que la clase Foo no tiene un método llamado getvalue(). Por supuesto, no sé cuáles son los miembros de esa clase, pero espero que sí. - Gorpik

Oh, lo siento, tienes que quitar el () (para obtener un puntero a una función, use solo su nombre, no lo llame). Respuesta editada de nuevo. - Gorpik

Todavía no funciona. error: 'getvalue' no es miembro de 'std :: pair :: second_type '- polapts

Entonces probablemente necesitarías un typename antes de std::pair<int, Foo>::second_type. De todos modos, dado que la respuesta de mkaes resolvió tu problema, no creo que valga la pena seguir andando con rodeos. - Gorpik

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.