declarando una prioridad_cola en c ++ con un comparador personalizado

Intento declarar una priority_queue of nodes , usando bool Compare(Node a, Node b) como la función de comparación (que está fuera de la clase de nodo).

Lo que tengo actualmente es:

 priority_queue<Node, vector, Compare> openSet; 

Por alguna razón, obtengo un Error: "Compare" is not a type name

Cambiar la statement a priority_queue <Node, vector, bool Compare>

me da Error: expected a '>'

También lo intenté:

 priority_queue<Node, vector, Compare()> openSet; priority_queue<Node, vector, bool Compare()> openSet; priority_queue<Node, vector, Compare> openSet; 

¿Cómo debo declarar correctamente mi priority_queue ?

Deberías declarar una clase Compare y sobrecargar al operator() de la siguiente manera:

 class Foo { }; class Compare { public: bool operator() (Foo, Foo) { return true; } }; int main() { std::priority_queue, Compare> pq; return 0; } 

O bien, si por alguna razón no puede hacerlo como clase, puede usar std::function para ello:

 class Foo { }; bool Compare(Foo, Foo) { return true; } int main() { std::priority_queue, std::function> pq(Compare); return 0; } 

El tercer parámetro de plantilla debe ser una clase que tenga operator()(Node,Node) sobrecargado. Entonces, deberás crear una clase de esta manera:

 class ComparisonClass { bool operator() (Node, Node) { //comparison code here } }; 

Y luego usará esta clase como el tercer parámetro de plantilla como este:

 priority_queue, ComparisonClass> q; 

Respondiendo su pregunta directamente:

Estoy tratando de declarar una priority_queue de nodos, usando bool Compare(Node a, Node b) as the comparator function

Lo que tengo actualmente es:

 priority_queue, Compare> openSet; 

Por alguna razón, obtengo un error:

 "Compare" is not a type name 

El comstackdor le dice exactamente lo que está mal: Compare no es un nombre de tipo, sino una instancia de una función que toma dos Nodes y devuelve un bool .
Lo que necesita es especificar el tipo de puntero a la función:
std::priority_queue, bool (*)(Node, Node)> openSet(Compare)

La respuesta aceptada le hace creer que debe usar una clase o una std::function como comparador. ¡Esto no es verdad! La respuesta de cute_ptr mostró cómo pasar una función al constructor, pero hay una manera más simple:

 priority_queue, decltype(&Compare)> openSet(Compare); 

Es decir, no hay necesidad de codificar explícitamente el tipo de función, puede dejar que el comstackdor haga eso por usted.