2016-06-12 8 views
0

Ich kann keine (benutzerdefinierte) priority_queue-Referenz übergeben. Die Prioritätswarteschlange wurde mit Lambda angepasst. Gibt es eine Problemumgehung? Ich habe versucht, functors und all das zu verwenden, aber keiner von ihnen würde mich über die Erstellung der priority_queue hinausgehen lassen, ohne den Kompilierungsschritt mit verschiedenen Problemen zu durchlaufen, bei denen der priority_queue-Konstruktor die Sortiermethode nicht akzeptierte. Ich denke, es kann nicht das Lambda erreichen oder es braucht nur eine spezielle Typ-Deklaration in der Kopfzeile, aber ich kann es nicht herausfindenÜbergeben der benutzerdefinierten Prioritätswarteschlange durch Referenz

Hier ist eine vereinfachte Version meines Codes.

#include <queue> 
#include <memory> 

struct Node 
{ 
    int full_dist, 
     dist1, 
     dist2; 

    Node(int d1, int d2) { full_dist = d1 + d2; } 
}; 

void some_processing(std::priority_queue<std::shared_ptr<Node>>& nodes) 
{ 
    //something being done with the queue 
} 

int main() 
{ 
    auto comp = [] (const std::shared_ptr<Node>& l, const std::shared_ptr<Node> r) -> bool 
    { return l->full_dist > r->full_dist; }; 

    std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>, decltype(comp)> nodes(comp); 
    some_processing(nodes);//breaks here 
} 

Hier ist der Fehler, den ich auf diesem Beispiel haben:

test.cpp:24:24: error: invalid initialization of reference of type ‘std::priority_queue<std::shared_ptr<Node> >&’ 
from expression of type ‘std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>, std::allocator<std::shared_ptr<Node> > >, main()::__lambda0>’ 
some_processing(nodes); 

Antwort

1

die Funktion auf dem Vergleichstyp Templat machen.

template<typename CompT> 
void some_processing(
    std::priority_queue<std::shared_ptr<Node>, 
         std::vector<std::shared_ptr<Node>>, 
         CompT> & nodes) 
{ 
    // something being done with the queue 
} 

Oder halten Sie die Dinge einfach und machen Sie den ganzen Container-Typ templated.

template<typename QueueT> 
void some_processing(QueueT& nodes) 
{ 
    // something being done with the queue 
} 
+0

Vielen Dank, das erklärt eine Menge – Liza

0

Ihre Prioritätswarteschlange ist

std::priority_queue<std::shared_ptr<Node>, 
      std::vector<std::shared_ptr<Node>>, decltype(comp)> 

Das ist es Typ deklariert wird. Der Parameter für Ihre Funktion ist ein Verweis auf:

std::priority_queue<std::shared_ptr<Node>> 

Dies ist ein ganz anderer Typ. Sie können einen Verweis auf einen Typ nicht an eine Funktion übergeben, die einen Verweis auf einen völlig anderen Typ als Parameter erwartet. Jede Instanz einer Vorlagenklasse ist einzigartig. Der Unterschied zwischen der ersten und der zweiten Klasse ist hier der gleiche Unterschied wie ein Unterschied zwischen class A und class B.

+0

Ich dachte, ich wusste einfach nicht, wie man diesen Typ beschreibt. Die andere Person beschrieb einen guten Weg, es auszuarbeiten. Danke für deine Antwort – Liza